【问题标题】:Elasticsearch Partial Phrase MatchElasticsearch 部分短语匹配
【发布时间】:2022-01-28 16:51:51
【问题描述】:

在 Elasticsearch 中,我想在搜索“John Ox”时匹配记录“John Oxford”。我目前正在使用match_phrase_prefix

{
    "query": {
        "match_phrase_prefix":{
            "SearchName": {
                "query": "John Ox"
            }            
        }
    }
}

我知道这不起作用,因为正如文档所述:

虽然设置简单,但使用 match_phrase_prefix 查询进行搜索自动完成有时会产生令人困惑的结果。

例如,考虑查询字符串 quick brown f。此查询通过创建一个由 quick 和 brown 组成的短语查询来工作(即,术语 quick 必须存在并且必须跟在术语 brown 之后)。然后它查看已排序的术语字典以查找以 f 开头的前 50 个术语,并将这些术语添加到短语查询中。

问题是前 50 个术语可能不包括术语 fox,因此不会找到短语 quick brown fox。这通常不是问题,因为用户会继续输入更多字母,直到出现他们要查找的单词。

有关按您输入搜索的更好解决方案,请参阅完成建议器和 search_as_you_type 字段类型。

那么,在不改变数据在 ES 中存储方式的情况下,是否有其他方法可以实现这一点?

【问题讨论】:

标签: elasticsearch


【解决方案1】:

您可以使用match bool prefix query。添加带有索引数据和搜索查询的工作示例

索引数据:

{
  "name":"John Oxford"
}

搜索查询:

{
  "query": {
    "match_bool_prefix" : {
      "name" : "John Ox"
    }
  }
}

搜索结果:

"hits" : [
      {
        "_index" : "idx",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 1.287682,
        "_source" : {
          "name" : "John Oxford"
        }
      }
    ]

【讨论】:

  • match_bool_prefix 不保证单词会像match_phrase_prefix 那样按顺序匹配。 John Ox 也将匹配(例如)Oxygen mask by John Corp
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-08
  • 2018-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多