【问题标题】:Elastic search exact match弹性搜索精确匹配
【发布时间】:2013-09-03 17:45:10
【问题描述】:

我正在使用elasticsearch,并且正忙着让精确匹配发生。我尝试了 match、query_string 等的各种组合,但要么一无所获,要么结果不好。 查询如下所示:

{
  "filter": {
    "term": {
      "term": "dog",
      "type": "main"
    }
  },
  "query": {
    "match_phrase": {
      "term": "Dog"
    }
  },
  "sort": [
    "_score"
  ]
}

排序结果

10.102211 {u'term': u'The Dog', u'type': u'main', u'conceptid': 7730506}
10.102211 {u'term': u'That Dog', u'type': u'main', u'conceptid': 4345664}
10.102211 {u'term': u'Dog', u'type': u'main', u'conceptid': 144}
7.147442 {u'term': u'Dog Eat Dog (song)', u'type': u'main', u'conceptid': u'5288184'}

我当然知道“The Dog”、“That Dog”和“Dog”都有相同的分数,但我需要弄清楚如何提高精确匹配“Dog”的分数。

我也试过了

{
  "sort": [
    "_score"
  ],
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "term": "Dog"
          }
        },
        {
          "match_phrase": {
            "term": {
              "query": "Dog",
              "boost": 5
            }
          }
        }
      ]
    }
  },
  "filter": {
    "term": {
      "term": "dog",
      "type": "main"
    }
  }
}

但这仍然只是给我

11.887239 {u'term': u'The Dog', u'type': u'main', u'conceptid': 7730506}
11.887239 {u'term': u'That Dog', u'type': u'main', u'conceptid': 4345664}
11.887239 {u'term': u'Dog', u'type': u'main', u'conceptid': 144}
8.410372 {u'term': u'Dog Eat Dog (song)', u'type': u'main', u'conceptid': u'5288184'}

【问题讨论】:

    标签: elasticsearch exact-match


    【解决方案1】:

    默认情况下使用标准分析器分析字段。如果您想检查完全匹配,您可以存储未分析的字段,例如:

    "dog":{
                "type":"multi_field",
                "fields":{
                    "dog":{
                        "include_in_all":false,
                        "type":"string",
                        "index":"not_analyzed",
                        "store":"no"
                    },
                    "_tokenized":{
                        "include_in_all":false,
                        "type":"string",
                        "index":"analyzed",
                        "store":"no"
                    }
                }
            }
    

    然后您可以查询 dog-field 以获得精确匹配,并使用 dog._tokenized 进行分析查询(如全文)

    【讨论】:

    • 这需要更改所有记录吗?我在这个索引中有大约 50,000,000 条(非常小的)记录。还是在适当的情况下使用此结构对索引进行核对并重新导入是否更有意义?我是 Lucene 的新手,如果我这样存储数据,我的 ES 查询将如何变化?谢谢你的帮助!我打算在这里询问设计索引的最佳方法,但我认为我会提出另一个问题。
    • 这正是我所需要的,我最终还是重建了数据,因为我想以不同的方式获得它,但我以此作为我的方法的基础。谢谢!
    【解决方案2】:

    我认为您的问题是字段term 正在使用标准分析器进行分析(检查您的映射),并且正在过滤诸如thethat 之类的停用词。因此,DogThe Dog 的得分相同。所以也许你可以通过配置自定义分析器来解决你的问题 => documentation page

    【讨论】:

      【解决方案3】:

      将需要搜索的两个值散列成hash key,然后搜索。

      【讨论】:

        猜你喜欢
        • 2020-03-06
        • 2017-01-09
        • 2015-08-02
        • 2015-10-07
        • 2014-08-18
        • 2012-02-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多