elasticsearch TERM查询不返回包含确切术语的文档

时间:2016-09-18 17:13:08

标签: elasticsearch

我的文件中有一个有价值的状态"好的"。

以下匹配查询返回此文档:

POST /bank/_search
{
    "query": {  
        "bool" : {
        "must" : {
            "match" : { "state" : "OK" }
        } 
}}}

以下术语查询不会返回状态为" OK":

的文档
POST /bank/_search
{
    "query": {  
        "bool" : {
        "must" : {
            "term" : { "state" : "OK" }
        } 
}}}

根据定义"术语查询查找包含倒排索引中指定的确切术语的文档。"我仍然很困惑为什么术语查询不会返回所需的文档。

我通过执行以下命令通过sense导入数据:

curl -XPOST 'localhost:9200/bank/account/_bulk?pretty' --data-binary "@accounts.json"
curl 'localhost:9200/_cat/indices?v'

如果有人也可以分享有关倒置/非倒置,分析/非分析和术语/匹配的信息,那将会很棒。我读到了这些但我仍感到困惑。

1 个答案:

答案 0 :(得分:2)

匹配查询始终在执行匹配之前对搜索文本执行分析,但 Term 查询会查找完全匹配。装置

当您插入文本"确定"时,默认ES执行分析(标准分析器)并将文本存储为"确定"反转指数(小写)。

所以使用匹配查询

进行搜索时
POST /bank/_search
{
    "query": {  
        "bool" : {
        "must" : {
            "match" : { "state" : "OK" }
        } 
}}}

" OK"文本转换为" ok"(根据状态分析器)并执行匹配。

对于术语查询,您必须手动将文本更改为较低的文本,因为它不会对搜索时间进行分析。

POST /bank/_search
{
    "query": {  
        "bool" : {
        "must" : {
            "term" : { "state" : "ok" } //lowercased
        } 
}}}

如果您一直在寻找" OK",那么您可以添加" Not Analyzed"在国家财产。 这意味着在存储时不会对状态属性进行分析和存储,那么您的术语和匹配查询将看起来很准确。

请看, How to not-analyze in ElasticSearch?