![](/img/trans.png)
[英]Elasticsearch match exact terms with spaces across different fields
[英]How to match terms with spaces in elasticsearch?
我有一个在elasticsearch中索引的内容字段(字符串)。 分析仪是默认的单标准分析仪。
当我使用匹配查询搜索时:
{"query":{"match":{"content":"micro soft", "operator":"and"}}}
结果显示它无法匹配“microsoft”。
那么如何使用输入关键字“微软”来匹配文档内容包含“微软”?
另一个解决方案是使用nGram令牌过滤器,这将允许您进行更“模糊”的匹配。
使用“microsoft”和“micro soft”的示例,下面是一个ngram标记过滤器如何分解标记的示例:
POST /test
{
"settings": {
"analysis": {
"filter": {
"my_ngrams": {
"type": "ngram",
"min_gram": "3",
"max_gram": "5"
}
},
"analyzer" : {
"my_analyzer" : {
"type" : "custom",
"tokenizer" : "standard",
"filter": ["my_ngrams"]
}
}
}
},
"mappings": {
"doc": {
"properties": {
"body": {
"type": "string",
"analyzer": "my_analyzer"
}
}
}
}
}
并分析这两件事:
curl '0:9200/test/_analyze?field=body&pretty' -d'microsoft'
{
"tokens" : [ {
"token" : "mic"
}, {
"token" : "micr"
}, {
"token" : "micro"
}, {
"token" : "icr"
}, {
"token" : "icro"
}, {
"token" : "icros"
}, {
"token" : "cro"
}, {
"token" : "cros"
}, {
"token" : "croso"
}, {
"token" : "ros"
}, {
"token" : "roso"
}, {
"token" : "rosof"
}, {
"token" : "oso"
}, {
"token" : "osof"
}, {
"token" : "osoft"
}, {
"token" : "sof"
}, {
"token" : "soft"
}, {
"token" : "oft"
} ]
}
curl '0:9200/test/_analyze?field=body&pretty' -d'micro soft'
{
"tokens" : [ {
"token" : "mic"
}, {
"token" : "micr"
}, {
"token" : "micro"
}, {
"token" : "icr"
}, {
"token" : "icro"
}, {
"token" : "cro"
}, {
"token" : "sof"
}, {
"token" : "soft"
}, {
"token" : "oft"
} ]
}
(我在这里删掉了一些输出,完整输出: https : //gist.github.com/dakrone/10abb4a0cfe8ce8636ad )
正如您所看到的,由于“微软”和“微软”的ngram术语重叠,您将能够找到此类搜索的匹配项。
试试这个ES wilcard ,如下所示
{
"query" : {
"bool" : {
"must" : {
"wildcard" : { "content":"micro*soft" }
}
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.