使用Elasticsearch搜索多个不完整的单词

时间:2014-09-08 21:53:13

标签: elasticsearch

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

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

例如,查询 qui bro 应该返回包含句子的记录快速棕色狐狸跳过懒狗,但不包含句子 >快速狐狸跳过懒狗

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

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

但我需要的是这些技术的一些组合,这将允许我同时搜索几个字段,并只查看单词的部分。并且只获取那些包含查询中包含其所有部分的单词的记录。

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

(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字段中进行搜索。

1 个答案:

答案 0 :(得分: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"]
          }
        }
      ]
    }
  }
}

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