【问题标题】:Elasticsearch - Score word match w/partial wordElasticsearch - 使用部分单词对单词匹配进行评分
【发布时间】:2020-02-02 16:56:01
【问题描述】:

我是 elasticsearch 新手,无法在结果中获得我想要的分数。

这是迄今为止我得到的最佳工作选择。

$options['query']['bool']['should'][] = [
    'match' => [
        'my_long_textfield' => [
            'query' => $query,
            'operator' => 'AND',
            'boost' => 15
        ]
    ]
];

$options['query']['bool']['should'][] = [
    'match' => [
        'my_long_textfield' => [
            'query' => $query,
            'minimum_should_match' => '80%'
        ]
    ]
];

示例数据集(两行):

my_long_textfield:
"some cars move fast"
"a car can move quickly"

如果我的查询是“car fast”,它将给第二行最高分,因为第一行包含“car”而不是“cars”。

我想给单词匹配以及部分单词打分。

因此,对于查询“car fast”,我们在单词“fast”上有一个匹配项,而“car”几乎是第一行中的一个单词匹配项。这应该比第二行只有一个单词匹配的得分更高。

如果有人能指出我正确的方向,将不胜感激。

【问题讨论】:

    标签: php elasticsearch search


    【解决方案1】:

    解决问题的方法有很多,但最简单的一种是利用分析器。在您的情况下,您可以将my_long_textfield 配置为使用english language analyzer,它除了删除停用词外,还可以进行词干提取(即索引car 用于cars),这是您在这里需要的(在深入研究之前)模糊)。

    因此,首先使用适合该字段的分析器创建索引:

    PUT test
    {
      "mappings": {
        "properties": {
          "my_long_textfield": {
            "type": "text",
            "analyzer": "english"
          }
        }
      }
    }
    

    然后索引两个测试文档:

    POST test/_doc/_bulk
    { "index": {}}
    { "my_long_textfield": "some cars move fast" }
    { "index": {}}
    { "my_long_textfield": "a car can move quickly" }
    

    然后,您的查询将得到您所期望的结果,即第一个文档的分数高于第二个文档:

    POST test/_search
    {
      "query": {
        "bool": {
          "should": [
            {
              "match": {
                "my_long_textfield": {
                  "query": "car fast",
                  "operator": "AND",
                  "boost": 15
                }
              }
            },
            {
              "match": {
                "my_long_textfield": {
                  "query": "car fast",
                  "minimum_should_match": "80%"
                }
              }
            }
          ]
        }
      }
    }
    

    结果 =>

    "hits" : [
      {
        "_index" : "test",
        "_type" : "_doc",
        "_id" : "w3uIlm0B0Vd4Dh649_Vg",
        "_score" : 14.0075,
        "_source" : {
          "my_long_textfield" : "some cars move fast"
        }
      },
      {
        "_index" : "test",
        "_type" : "_doc",
        "_id" : "xHuIlm0B0Vd4Dh649_Vg",
        "_score" : 0.18232156,
        "_source" : {
          "my_long_textfield" : "a car can move quickly"
        }
      }
    ]
    

    如果您想得更远一点,我们还可以添加一个synonym token filter,因为fastquick 的含义相同,但这是另一个讨论。

    【讨论】:

      猜你喜欢
      • 2016-10-10
      • 1970-01-01
      • 2013-10-28
      • 1970-01-01
      • 2018-11-01
      • 1970-01-01
      • 2013-08-08
      • 2016-03-01
      • 2014-07-19
      相关资源
      最近更新 更多