当前位置: 首页 > 知识库问答 >
问题:

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

翁翰墨
2023-03-14

我有一个记录数据库,每个记录都有一个右和一个左字段,这两个字段都包含文本。数据库使用Elasticsearch建立索引。

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

例如,qui bro查询应该返回包含“敏捷的棕色狐狸跳过了懒惰的狗”这句话的记录,而不是包含“敏捷的狐狸跳过了懒惰的狗”这句话的记录

我已经看到了如何使用Elasticsearch执行前缀查询的描述(并且在一个字段中搜索一个单词时可以重现它)。

我还看到了如何执行多匹配查询来同时搜索多个字段的描述。

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

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

(旁白:在某种程度上,我的问题可能是这个问题的重复,但由于从未得到回答,我希望我问自己的问题不会违反任何规则。)

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

更新:

哦,我可能有问题的第一部分。以下是我的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搜索结合起来(通过右和左字段进行搜索。

共有1个答案

罗鸿福
2023-03-14

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

以下是用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"]
          }
        }
      ]
    }
  }
}

这似乎行得通。但是如果有人有其他解决方案(特别是如果这些解决方案会使搜索不敏感),我很乐意听到他们。

 类似资料:
  • 问题内容: 我曾经使用过django,haystack和elasticsearch。 我的search_index.py: 搜索表格: 模板: 看 ` 我得到所有的价值,那里有“老板”和“挡泥板” 当您在搜索框中输入“ boss fender”时,我没有结果。从搜索表单中,我只能得到一个单词的结果,例如“老板”。如何使搜索多个单词的能力? 问题答案: 这个月我陷入了这个问题。 为了执行正确的查询,

  • 问题内容: 使用Elasticsearch完成建议程序时,我在返回与一词查询匹配的多词输入建议时遇到问题。 示例结构: 工作查询: 结果 查询失败: 结果 我希望得到与工作查询相同的结果,匹配“猫狗”。有什么建议是什么问题,以及如何使失败的查询正常工作?当使用标准分析器而不是空白分析器时,我得到相同的结果。我想每个输入字符串使用多个单词,如上面的示例所示。 问题答案: 完成建议器是前缀建议器,这意

  • 问题内容: 示例数据: 还有一个示例查询: 首先返回击中的猫,然后返回狗,这就是我想要的。 但是 当您查询时,猫和狗的相关性得分相同。我希望能够考虑到该单词的前缀(并且可能在该字段中添加了其他几个单词),然后运行。 因此,如果我搜索: 要么 我应该得到cat / ID 1,但没有。 我发现使用可以实现多词短语,但不能实现多不完整的短语。并获得不完整的短语,但不能获得多个不完整的短语… 筛选文档确实

  • 问题内容: 我目前正在使用Tire Client进行elasticsearch。可以说我有一个字段,该字段在我的elasticsearch映射中被索引为很长的类型的字段。我正在尝试实现以下目标: “ id”是我一直在谈论的领域。但是由于我在查询中指定了字段,所以通配符不起作用,最终我得到了唯一匹配的结果。 但是对_all搜索也可以执行相同的操作,因为字段类型无关紧要。我希望此通配符搜索有效,同时还

  • 问题内容: 我有一个,并且效果很好,直到我在输入中添加了一个空格。例如,如果我列出了许多历史事件(英国战役(1940年),大爆炸战役(1944年),[插入大量战斗],拿破仑的致命游行(1812年),[插入许多其他历史事件]) 。 当我输入“ ”或“ ”时,我会得到所有战斗的列表(尽管似乎有最大战斗),而当我输入“ ”时,结果会出现。 但是,当我输入时,该列表为空,与输入时我没有得到任何匹配的原因相

  • 问题内容: 我想搜索一个XML值列,看是否包含一个字符串。我不知道架构,我想知道字符串是否包含在任何地方。我不知道XPATH是否可以在这种情况下工作。 相当于 错误:参数数据类型xml对于同类函数的参数1无效。 相关表格列 我要搜索的项目应该是一个属性。因此,如果上述方法不可能实现,那么包含该属性的任何内容都将是一个不错的选择。 问题答案: 最简单(但绝对不是最快执行)的方法是在将列传递给之前将其