Elasticsearch:如何找出一个值是否与列表中的任何值匹配?

我刚刚开始学习Elasticsearch。我的数据包含公司名称及其网站,并且我有一个列表,其中包含公司的所有域别名。我正在尝试编写一个查询,以提高列表中相同网站的记录。

我的数据如下:

{"company_name": "Kaiser Permanente","website": "http://www.kaiserpermanente.org"},{"company_name": "Kaiser Permanente - Urgent Care","website": "http://kp.org"}.

域别名的列表为:

["kaiserpermanente.org","kp.org","kpcomedicare.org","kp.com"]

实际列表比上面的示例长。我已经尝试过以下查询:

{
  "bool": {
    "should": {
      "terms": {
        "website": [
          "kaiserpermanente.org","kp.com"
        ],"boost": 20
      }
    }
  }
}

该查询不返回任何内容,因为“条件”查询完全匹配。列表中的域和url相似但不相同。

除了查询,我应该返回示例中的两条记录。我认为“匹配”可以工作,但是我不知道如何将值与列表中的任何相似值匹配。

我发现了类似的问题How to do multiple "match" or "match_phrase" values in ElasticSearch。该解决方案有效,但我的别名列表包含50多个元素。如果我为每个元素写多个“ match_phrase”,将非常冗长。有没有更有效的方式,例如“条款”,这样我就可以通过列表?

如果有人可以帮助我,我将不胜感激,谢谢!

tammyluxiuliang 回答:Elasticsearch:如何找出一个值是否与列表中的任何值匹配?

许多stackoverflow帖子/ ES文档都介绍了您正在观察的内容-termsmatch之间的区别。当您存储该信息时,我假设您正在使用standard分析器。这意味着当您按“ http://kp.org”时,Elasticsearch索引的[ "http","kp","org" ]令牌已断开。但是,当您使用terms时,它会查找“ kp.org”,但没有这样的“ kp.org”标记来查找匹配项,因为在索引编制时分析器已将其分解。 match但是会​​分解您要查询的内容,这样“ kp.org” => [ "kp","org" ]就能找到一个或两个。词组匹配仅要求令牌彼此相邻,这可能是您需要的。

不幸的是,似乎没有像match那样起作用的选项,但允许许多值与terms相似。我相信您有三种选择:

  • 按照您引用的stackoverflow帖子中的描述以编程方式生成查询,您注意到该查询很冗长,但是除非您使用1k别名,否则我认为这可能没问题。

  • 分析website字段,以便分析转换“ http://www.kaiserpermanente.org” =>“ kaiserpermanente.org”和“ http://kp.org” =>“ kp.org”以便建立索引。使用这种索引时间分析方法,在查询时,您可以成功使用terms过滤器。鉴于url是结构化的,并且您概述的用例似乎只与域有关,这可能很好。如果这样做,请使用multi fields以多种方式分析一个网站的价值。最好让Elasticsearch为您完成这种工作,而不必担心您自己的代码中有此问题。

  • 事先进行此处理(在将数据推送到ES之前),以便在将数据存储到Elasticsearch中时,不仅存储网站字段,还存储域,路径以及其他任何您需要预先计算的内容。您只需付出一定的努力即可获得控制权。

本文链接:https://www.f2er.com/3115078.html

大家都在问