弹性搜索完全匹配

Jos*_*son 14 exact-match elasticsearch

我正在使用弹性搜索,而且我有一个时间的魔鬼可以完全匹配.我已经尝试过match,query_string等的各种组合,我得到的结果都不算什么.查询看起来像这样:

{
  "filter": {
    "term": {
      "term": "dog",
      "type": "main"
    }
  },
  "query": {
    "match_phrase": {
      "term": "Dog"
    }
  },
  "sort": [
    "_score"
  ]
}
Run Code Online (Sandbox Code Playgroud)

排序结果

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'}
Run Code Online (Sandbox Code Playgroud)

我看,当然,"狗","那条狗"和"狗"都有相同的分数,但我需要弄清楚如何在分数中提升完全匹配"狗".

我也试过了

{
  "sort": [
    "_score"
  ],
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "term": "Dog"
          }
        },
        {
          "match_phrase": {
            "term": {
              "query": "Dog",
              "boost": 5
            }
          }
        }
      ]
    }
  },
  "filter": {
    "term": {
      "term": "dog",
      "type": "main"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

但那仍然只是给了我

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'}
Run Code Online (Sandbox Code Playgroud)

run*_*arM 14

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

"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"
                }
            }
        }
Run Code Online (Sandbox Code Playgroud)

然后你可以查询dog-field以获得完全匹配,dog._tokenized用于分析查询(如全文)

  • 这是否需要对所有记录进行更改?我在这个指数中只有少量50,000,000(非常小)的记录.或者更有意义的是,在合适的情况下核对索引并重新导入这个结构?对于Lucene来说,我是新手,如果我存储了这样的数据,我的ES查询会如何变化?谢谢你的帮助!我打算在这里询问设计索引的最佳方法,但我会想到另一个问题. (3认同)