elasticsearch匹配精确词

时间:2019-12-09 14:46:23

标签: elasticsearch

我正在使用Elasticsearch中的Enron-dataset。 邮件正文分为多个段落,这些段落存储为嵌套文档。但是,除此之外,我只想让您理解查询本身。
我想验证一切是否按预期进行,因此我在语料库中查找了一个不常见的词,并希望对其进行查询。我的目的是检查总命中值是否正确。我很困惑,因为我总是得到10000的高值。
我选择了electrons一词,它在语料库中多次出现。但是,我的查询也匹配electronic,它实际上包含在语料库中的每封邮件中(我夸大了)。
这是我的查询:

curl -X GET "localhost:9200/enron/_search?pretty" -H 'Content-Type: application/json' -d'
{
  "_source": {
    "includes": [ "*" ],
    "excludes": [ "body" ]
  },
  "query": {
    "nested": {
      "path": "body",
      "inner_hits": {       

      },
      "query": {
        "constant_score" : {
            "filter": {
                "match": {
                    "body.content" : "electrons" 
                }
            }
        }
      }
    }
  }
}
'

不要介意周围的所有内容。看起来像这样,因为我只对包含单词electrons的段落感兴趣。这已经是一个测试查询,用于了解幕后情况。它返回文档,并且仅返回具有匹配术语的内部文档(正文)。
我怀疑match过滤器是罪魁祸首。因此,我将过滤器中的查询更改为match_phrase。但是,这并没有改变任何东西。

如何在文本字段(嵌套文档中)中匹配单词electrons,而又不匹配electronic和其他类似单词?

编辑:
建议不要在文本字段中使用建议的Term query。旁白,它错误地返回了0个匹配:

{
  "_source": {
    "includes": [ "*" ],
    "excludes": [ "body" ]
  },
  "query": {
    "nested": {
      "path": "body",
      "inner_hits": {       

      },
      "query": {
        "constant_score" : {
            "filter": {
                "term": {
                    "body.content" : "electrons" 
                }
            }
        }
      }
    }
  }
}
'
{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 0,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [ ]
  }
}

Edit2:
我想我已经找到错误了。文本字段的分析器设置为snowball。难怪没有找到与该词完全匹配的词。
我正在重新编制索引。

Edit3:
这都是我的错。它可以与标准分析仪一起使用。顺便说一下,ES还使用match找到了正确的文档。

1 个答案:

答案 0 :(得分:0)

使用术语过滤器代替完全匹配的单词,请参见下面的说明

What is the difference between a term query and a match one?