elasticsearch CamelCase搜索与Elasticsearch
我想配置Elasticsearch,以便搜索“JaFNam”将为“JavaFileName”创建一个好的分数 我试图构建一个分析器,它将CamelCase
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
模式
分析器与一个边缘内存
标记器相结合。我认为这会产生如下术语:
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}]])"
}
}
}
}
}