为什么ES match_phrase_prefix搜索结果与搜索词不匹配?

新手上路,请多包涵

*es版本7.6.2, match_phrase_prefix搜索结果和搜索词的前缀不匹配
这是我的搜索条件

{ 
  "query" :{
    "match_phrase_prefix": {
      "name": {
        "query": "奶"
      }
    }
  }
}
  {
    "_index" : "test_index2",
    "_type" : "_doc",
    "_id" : "3ooVRIwBM2RKK1WvFNUC",
    "_score" : 0.40264052,
    "_source" : {
      "name" : "姨奶奶"
    }
  },
  {
    "_index" : "test_index2",
    "_type" : "_doc",
    "_id" : "2IofQ4wBM2RKK1Wv5tX5",
    "_score" : 0.3398124,
    "_source" : {
      "name" : "奶盖"
    }
  },
  {
    "_index" : "test_index2",
    "_type" : "_doc",
    "_id" : "14ofQ4wBM2RKK1WvgdWm",
    "_score" : 0.26098993,
    "_source" : {
      "name" : "牛奶好喝"
    }
  },
  {
    "_index" : "test_index2",
    "_type" : "_doc",
    "_id" : "2YogQ4wBM2RKK1WvgNX1",
    "_score" : 0.26098993,
    "_source" : {
      "name" : "旺仔牛奶"
    }
  }

这个是搜索结果,很多结果并不是以奶开头*

修改max_expansions或者slop的值都没有用

阅读 473
avatarAI BotBETA

这个问题可能是由于 match_phrase_prefix 查询的工作方式导致的。match_phrase_prefix 查询在执行时会尝试找到与输入的查询词匹配的字段,并且该字段的词必须是查询词的前缀。然而,这个查询并不会检查该词是否确实以查询词开头。

在你的例子中,你搜索的词是 "奶",而 "姨奶奶"、"奶盖"、"牛奶好喝"、"旺仔牛奶" 都不是 "奶" 的前缀,但它们仍然出现在了搜索结果中。这可能是因为 Elasticsearch 尝试找到包含查询词的字段,并且这个字段的值是查询词的前缀,而它并不会检查该字段的值是否确实以查询词开头。

如果你希望只获取以 "奶" 开头的字段,你可能需要使用其他类型的查询,例如 match 查询或 prefix 查询。

例如,使用 match 查询:

{
  "query": {
    "match": {
      "name": {
        "query": "奶",
        "type": "phrase_prefix"
      }
    }
  }
}

或者使用 prefix 查询:

{
  "query": {
    "prefix": {
      "name": {
        "value": "奶"
      }
    }
  }
}

这两种查询都会返回以 "奶" 开头的字段。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进