如何解决为什么模糊查询返回匹配项但模糊查询不在同一输入上?
我在 Elasticsearch 中创建了以下索引:
PUT /my-index
{
"settings": {
"analysis": {
"analyzer": {
"my_analyzer": {
"tokenizer": "whitespace","filter": ["lowercase","3_5_edgegrams"]
}
},"filter": {
"3_5_edgegrams": {
"type": "edge_ngram","min_gram": 3,"max_gram": 10
}
}
}
},"mappings": {
"properties": {
"name": {
"type": "text","analyzer": "my_analyzer"
}
}
}
}
然后我插入了以下文档:
{
"name": "Nuvus Gro Corp"
}
当我进行以下查询时(我们称之为 fuzzy_query
):
GET /my-index/_search
{
"query": {
"fuzzy": {
"name": {
"value": "qnuv"
}
}
}
}
我得到了上述文档的匹配项。
当我进行查询时(让我们将查询称为 match_with_fuzziness
):
GET /my-index/_search
{
"query": {
"match": {
"name": {
"query": "qnuv","fuzziness": "AUTO"
}
}
}
}
我没有匹配项。如果我进行以下查询:
GET /my-index/_search
{
"query": {
"match": {
"name": {
"query": "nuvq","fuzziness": "AUTO"
}
}
}
}
我又得到了一场比赛。我不明白为什么在进行 match_with_fuzziness
查询时没有得到任何匹配项。
编辑:我使用 Kibana Profiler 分析了查询,根据分析器 match_with_fuzziness
是 SynonymQuery Synonym(name:qnu name:qnuv)
查询,而 fuzzy_query
是 BoostQuery (name:nuv)^0.6666666
解决方法
与your other question中解释的问题非常相似。
问题是您没有指定特定的 search_analyzer
,因此在搜索时 qnuv
和 nuvq
也会被 my_analyzer
和 edge-ngramed 分析,因此是您收到的匹配项。
如果我们检查第一个查询,因为您使用的是 fuzzy
查询,qnuv
(搜索词)将匹配 nuv
(第一个索引的边-ngramed 标记)距离为 1(即第一个 q
是“容忍的”),这是 fuzzy
查询默认执行的操作(使用 "fuzziness: AUTO")
在第三个查询中,nuv
(搜索词的第一个边 ngramed 标记)将匹配 nuv
(第一个索引的边 ngramed 标记)。
第二个查询的情况有点特殊,我在下面引用了 fuzziness
parameter works in the context of match
queries
模糊匹配不适用于具有同义词的术语或分析过程在同一位置产生多个标记的情况。在幕后,这些术语被扩展为一个特殊的同义词查询,它混合了术语频率,不支持模糊扩展。
粗体部分适用于您的情况。由于搜索词qnuv
是由my_analyzer
分析的,所以它在同一位置产生了两个标记qnu
和qnuv
,不支持模糊匹配。
您需要将映射更改为此映射,它会按照您期望的方式工作,即所有三个查询都将返回您的文档:
"mappings": {
"properties": {
"name": {
"type": "text","analyzer": "my_analyzer","search_analyzer": "standard" <---- add this line
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。