elasticsearch CamelCase搜索与Elasticsearch,elasticsearch,full-text-search,analyzer,camelcasing,elasticsearch,Full Text Search,Analyzer,Camelcasing" /> elasticsearch CamelCase搜索与Elasticsearch,elasticsearch,full-text-search,analyzer,camelcasing,elasticsearch,Full Text Search,Analyzer,Camelcasing" />

elasticsearch CamelCase搜索与Elasticsearch

elasticsearch CamelCase搜索与Elasticsearch,elasticsearch,full-text-search,analyzer,camelcasing,elasticsearch,Full Text Search,Analyzer,Camelcasing,我想配置Elasticsearch,以便搜索“JaFNam”将为“JavaFileName”创建一个好的分数 我试图构建一个分析器,它将CamelCase模式分析器与一个边缘内存标记器相结合。我认为这会产生如下术语: J F N Ja Fi Na Jav Fil Nam Java File Name 但标记器似乎没有任何效果:我一直得到这些术语: Java File Name 正确的Elasticsearch配置是什么样的 示例代码: curl -XPUT 'http://127.0

我想配置Elasticsearch,以便搜索“JaFNam”将为“JavaFileName”创建一个好的分数

我试图构建一个分析器,它将CamelCase
模式
分析器与一个
边缘内存
标记器相结合。我认为这会产生如下术语:

J F N Ja Fi Na Jav Fil Nam Java File Name
但标记器似乎没有任何效果:我一直得到这些术语:

Java File Name
正确的Elasticsearch配置是什么样的


示例代码:

curl -XPUT    'http://127.0.0.1:9010/hello?pretty=1' -d'
{
  "settings":{
    "analysis":{
      "analyzer":{
        "camel":{
          "type":"pattern",
          "pattern":"([^\\p{L}\\d]+)|(?<=\\D)(?=\\d)|(?<=\\d)(?=\\D)|(?<=[\\p{L}&&[^\\p{Lu}]])(?=\\p{Lu})|(?<=\\p{Lu})(?=\\p{Lu}[\\p{L}&&[^\\p{Lu}]])",
          "filters": ["edge_ngram"]
        }
      }
    }
  }
}
'
curl -XGET    'http://127.0.0.1:9010/hello/_analyze?pretty=1' -d'
{
  "analyzer":"camel",
  "text":"JavaFileName"
}'

您的分析器定义不正确。您需要一个
标记器
和一个
过滤器数组
,因为您的分析器不工作。试着这样做:

{
  "settings": {
    "analysis": {
      "analyzer": {
        "camel": {
          "tokenizer": "my_pattern",
          "filter": [
            "my_gram"
          ]
        }
      },
      "filter": {
        "my_gram": {
          "type": "edge_ngram",
          "max_gram": 10
        }
      },
      "tokenizer": {
        "my_pattern": {
          "type": "pattern",
          "pattern": "([^\\p{L}\\d]+)|(?<=\\D)(?=\\d)|(?<=\\d)(?=\\D)|(?<=[\\p{L}&&[^\\p{Lu}]])(?=\\p{Lu})|(?<=\\p{Lu})(?=\\p{Lu}[\\p{L}&&[^\\p{Lu}]])"
        }
      }
    }
  }
}
{
“设置”:{
“分析”:{
“分析器”:{
“骆驼”:{
“标记器”:“我的模式”,
“过滤器”:[
“我的克”
]
}
},
“过滤器”:{
“我的克”:{
“类型”:“边缘图”,
“最大克数”:10
}
},
“标记器”:{
“我的模式”:{
“类型”:“模式”,

“模式”:“([^\\p{L}\\d]+)|(?你只能有一个标记器,
pattern
edge\u ngram
,但不能同时使用这两个标记器。此外,我不确定为什么字符大小写会有任何区别。它与搜索
JaFNam
JaFNam
有多大区别?@Val eclipse和IntelliJ IDEs使用这种“大小写解释”"。它们对
JaFNam
JaFNam
的解释不同。我想在搜索中使用相同的行为。@Val我可以使用
edge\u ngram
过滤器而不是
edge\u ngram
标记器来实现所需的行为吗?是的,还有一个
edge\u ngram
过滤器,您可以try@Val可悲的是,我得到了和你一样的结果n使用筛选器。我更新了我的问题以使用筛选器而不是标记器。哦,是的,
max_gram
默认为2。我已更新了我的答案,很高兴它有帮助!
{
  "settings": {
    "analysis": {
      "analyzer": {
        "camel": {
          "tokenizer": "my_pattern",
          "filter": [
            "my_gram"
          ]
        }
      },
      "filter": {
        "my_gram": {
          "type": "edge_ngram",
          "max_gram": 10
        }
      },
      "tokenizer": {
        "my_pattern": {
          "type": "pattern",
          "pattern": "([^\\p{L}\\d]+)|(?<=\\D)(?=\\d)|(?<=\\d)(?=\\D)|(?<=[\\p{L}&&[^\\p{Lu}]])(?=\\p{Lu})|(?<=\\p{Lu})(?=\\p{Lu}[\\p{L}&&[^\\p{Lu}]])"
        }
      }
    }
  }
}