使用Elasticearch搜索多个字段并输出总分

rjjhvcjd  于 2022-10-06  发布在  ElasticSearch
关注(0)|答案(2)|浏览(204)

我有多个字段,例如。f1f2f3,我想要针对每一个搜索单个词,并在任何字段匹配的地方返回聚合分数。我不想搜索每个领域的相同的条件,只搜索一个领域的自己的条件,例如。f1:t1f2:t2f3:t3

最初,我使用must布尔查询和multi_match,所有字段都连接为t1 t2 t3,并搜索所有字段,但结果不是很好。使用dis_max查询可以获得更好的结果,因为我能够按其各自的术语搜索各个字段,但如果例如在f1中找到t1,在f2中找到t2,则dis_max的结果返回最高的结果分数。因此,如果我有3个文档,{ "f1": "foo", "f2": "foo" }{ "f1": "foo", "f2": "bar" }{ "f1": "foo", "f2": "baz" },并且我搜索f1:foof2:ba,我仍然可以在最近创建foo的情况下,检索到f2的第一条记录。我想说的是,f1匹配foo,因此有一个与此相关的分数,f2匹配bar,因此结果分数应该是f1.score + f2.score,因为两者都匹配。

我发现我可以通过编程方式构建一个使用query_string的查询,例如。(为简洁起见,仅限于两个字段)

GET /_search
{
  "query": {
    "query_string": {
      "query": "(f1:foo OR f1.autocomplete:foo) OR (f2:ba OR f2.autocomplete:ba)"
    }
  }
}

但我需要增加对田地的提振,这是不允许的。我也可以使用dis_max和一组queries,但我真的不确定在这种情况下如何汇总分数。

用更好的话说,我试图搜索的是:如果我有人的数据,我想搜索名字和姓氏,而不是先按姓搜索,而不是按名搜索,与只返回其中之一的结果相比,名字和姓氏都匹配的结果应该更高。

有没有更好的/好的/适当的方法来实现这一点?我觉得我已经看了很多Query API,但还没有找到最好的东西。

41ik7eoe

41ik7eoe1#

您可以使用简单的应该查询

minimum_should_match:1,
 "should" : [
        { "term" : { "f1" : "foo" } },
        { "term" : { "f2" : "ba" } }
      ]

一个文档匹配的子句越多,它的分数就越高。

oo7oh9g9

oo7oh9g92#

无法编辑提供的答案,因此在此处发布从其他答案派生的解决方案。

GET _search
{
  "query": {
    "bool": {
      "minimum_should_match": 1,
      "should": [
        {
          "match": {
            "f1": {
              "query": "foo",
              "boost": 1.5
            }
          }
        },
        {
          "match": {
            "f1.autocomplete": {
              "query": "foo",
              "boost": 1.5
            }
          }
        },
        {
          "match": {
            "f2": {
              "query": "ba",
              "boost": 1
            }
          }
        },
        {
          "match": {
            "f2.autocomplete": {
              "query": "ba",
              "boost": 1
            }
          }
        }
      ]
    }
  }
}

这将使我得到符合我所有标准的结果。

相关问题