【问题标题】:ElasticSearch - Phrase Query with Prefix gets no resultsElasticSearch - 带前缀的短语查询没有结果
【发布时间】:2019-03-14 15:18:56
【问题描述】:

我有一个使用空格标记器以及小写和 asciifolding 过滤器进行分析的字段。我正在尝试运行一个同时包含前缀和通配符的查询。我们正在用 ElasticSearch 替换使用纯 Lucene 的本土搜索引擎,类似的查询确实适用于 Lucene 语法,但不适用于 ElasticSearch。

例如,此查询将查找“name”字段中包含“smith john”的所有文档。

{
"query": {
    "simple_query_string": {
        "query": "\"smith john\"",
        "fields": ["name"],
        "default_operator": "AND"
        }
    }
}

但是,我还想查找“smith johnny”、“smith john a”等。在我们的 Lucene 代码中,我们只是添加了前缀运算符来执行此搜索,但它会产生 0 个结果。

{
"query": {
    "simple_query_string": {
        "query": "\"smith joh*\"",
        "fields": ["name"],
        "default_operator": "AND"
        }
    }
}

如果我省略引号,我会得到结果,但这包括在同一文档中索引的具有两个名称的文档,例如“smith barry”和“wilson john”。我只想要“smith john”和“smith johnny”等名字。

我也尝试了 query_string 的变体,结果相似。

我知道我可以使用“match_phrase_prefix”来搜索“smith joh”,但这有其自身的局限性,例如限制通配符的使用以及需要知道或猜测 max_expansions 的值。

我需要更改哪些内容才能从第二个查询中获取结果?谢谢。

【问题讨论】:

  • 您好,您的问题解决了吗?我的回答有帮助吗?

标签: elasticsearch


【解决方案1】:

您是否考虑过使用prefix 或wildcard 术语级查询?当然,您的name 字段需要keyword 类型的多字段(对于字符串字段,这是默认设置),但您无需担心max_expansions。

那么,您的查询可能如下所示:

{
  "query": {
    "prefix": {
      "name.keyword": "smith joh"
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多