【问题标题】:Search for multiple incomplete words with Elasticsearch使用 Elasticsearch 搜索多个不完整的单词
【发布时间】:2025-11-26 06:20:02
【问题描述】:

我有一个记录数据库,每个记录都有一个right 和一个left 字段,并且这两个字段都包含文本。该数据库使用 Elasticsearch 进行索引。

我想搜索这些记录的两个字段,并找到在任何字段中包含两个或多个具有某些前缀的单词的记录。搜索应该足够具体,以便仅查找包含查询中所有字词的记录,而不仅仅是其中的一部分。

例如,查询 qui bro 应该返回包含句子 The quick brown fox jumped over the lazy dog 的记录,而不是包含句子 的记录>快狐跳过懒狗

我看到了关于如何perform prefix queries with Elasticsearch 的描述(并且在一个字段中搜索一个单词时可以重现它)。

我还看到了有关如何使用 perform multi-match queries 一次搜索多个字段的说明。

但我需要的是这些技术的某种组合,这样我既可以一次搜索多个字段,又可以只查找单词的一部分。并且只获取那些包含其部分包含在查询中的所有单词的记录。

我该怎么做?任何方法都可以(前缀、ngram 等)。

(PS:我的问题在一定程度上可能与this one 重复,但由于从未得到回答,我希望我的提问不会违反任何规则。)

========================================

更新:

哦,我可能有问题的第一部分。这是我的 Rails 应用程序中似乎可以使用的语法(使用 elasticsearch-rails gem):

response = Paragraph.search query: {bool: { must: [ { prefix: {right: "qui"}}, {prefix: {right: "bro"}} ] } }

或者,用纯 Elasticsearch 语法重写它:

{
  "bool": {
    "must": [
      { "prefix": { "right": "qui" }},
      { "prefix": { "right": "bro"   }}
    ]
  }
}

所以我现在更新的问题是如何将此前缀搜索与 multi_match 搜索结合起来(通过 rightleft 字段进行搜索。

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    好的,这是一个似乎可行的可能答案。代码必须在多个字段中搜索几个不完整的单词,并只返回包含所有这些单词的记录。

    这是用 elasticsearch-rails 语法编写的请求:

    response = Paragraph.search query: {bool: { must: [ { multi_match: { query: "qui", type: "phrase_prefix", fields: ["right", "left"]}}, { multi_match: { query: "brow", type: "phrase_prefix", fields: ["right", "left"]}}]}}
    

    或者,用 Elasticsearch 网站上使用的语法重写:

    {query:
      {bool:
        { must:
         [ 
           { multi_match:
             {
              query: "qui",
              type: "phrase_prefix",
              fields: ["right", "left"]
              }
            }, 
           { multi_match: 
             { 
              query: "brow",
              type: "phrase_prefix",
              fields: ["right", "left"]
              }
            }
          ]
        }
      }
    }
    

    这似乎有效。但如果有人有其他解决方案(特别是如果这些解决方案会使搜索不区分大小写),我会很高兴听到他们的意见。

    【讨论】: