我有一个在elasticsearch中编入索引的内容字段(字符串)。分析仪是默认的单标准分析仪。
当我使用匹配查询进行搜索时:
{"query":{"match":{"content":"micro soft", "operator":"and"}}}
结果显示它无法匹配" microsoft"。
然后如何使用输入关键字" micro soft"匹配文档内容包含" microsoft"?
答案 0 :(得分:1)
另一种解决方案是使用 nGram 令牌过滤器,它可以让你有更多的模糊"匹配。
将您的示例用于" microsoft"和"微软",这是一个如何的例子 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)
正如您所看到的,因为" microsoft"和"微软"交叠, 你可以找到这样的搜索匹配。
答案 1 :(得分:1)
解决此问题的另一种方法是进行单词分解,您可以使用基于字典的方法:Compound Word Token Filter或使用以算法方式分解单词的插件:Decompound plugin。
单词microsoft
会例如被分成以下标记:
{
"tokens": [
{
"token": "microsoft",
},
{
"token": "micro",
},
{
"token": "soft",
}
]
}
此令牌将允许您搜索您提出的部分字词。
与其他答案中提到的ngrams
方法相比,这种方法可以获得更高的精确度,只有略低的召回率。
答案 2 :(得分:0)
尝试以下ES wilcard
{
"query" : {
"bool" : {
"must" : {
"wildcard" : { "content":"micro*soft" }
}
}
}
}