我正在使用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
找到了正确的文档。
答案 0 :(得分:0)
使用术语过滤器代替完全匹配的单词,请参见下面的说明
What is the difference between a term query and a match one?