Elasticsearch bool must_not不适用于多字段。

时间:2016-02-08 11:45:54

标签: elasticsearch

我使用多字段https://www.elastic.co/guide/en/elasticsearch/reference/current/_multi_fields.html

以下是我的映射的一部分:

...
"Diagnosis": {
               "type": "string",
               "fields":{
                 "not_analyzed":{
                    "type":"string",
                    "index":"not_analyzed"
                 }
                }
            }
...

我运行此查询:

curl -XGET 'elasticsearch_server:9200/db-index/Diagnosis/_search?pretty' -d '{"query": {"bool": {"must_not": [{"match": {"Diagnosis.not_analyzed": "F06.4 - Organic anxiety disorder"}}], "must": [{"match": {"Diagnosis": "Dementia disease disorder"}}]}}}'

尽管有must_not子句,上面的查询返回" F06.4 - 有机焦虑症"其他结果中的字符串。

我可以用焦虑排除所有结果'这样做的话

curl -XGET 'elasticsearch_server:9200/db-index/Diagnosis/_search?pretty' -d '{"query": {"bool": {"must_not": [{"match": {"Diagnosis": "anxiety"}}], "must": [{"match": {"Diagnosis": "Dementia disease disorder"}}]}}}'

但目标是只排除确切的字符串" F06.4 - 有机焦虑症"从结果。 我怎么能这样做?

2 个答案:

答案 0 :(得分:1)

如果要排除精确字符串,请使用term query之类的。{/ p>

curl -XGET 'elasticsearch_server:9200/db-index/Diagnosis/_search? pretty' -d '{"query": {"bool": {"must_not": [{"term": {"Diagnosis.not_analyzed": "F06.4 - Organic anxiety disorder"}}], "must": [{"match": {"Diagnosis": "Dementia disease disorder"}}]}}}'

希望这有帮助

答案 1 :(得分:1)

试试这个 1)将映射更改为小写数据但不要按字(默认映射)

进行剪切
curl -XPUT 'localhost:9200/...../' -d '{
 "settings":{
     "index":{
        "analysis":{
           "analyzer":{
              "keylower":{
                 "tokenizer":"keyword",
                 "filter":"lowercase"
              }
           }
        }
     }
  },
  "mappings":{
        "specimens" : {
            "_all" : {"enabled" : true},
            "_index" : {"enabled" : true},
            "_id" : {"index": "not_analyzed", "store" : false},
            "properties" : {

                "Diagnosis" : {"type" : "string",   "store" : "yes","index": "not_analyzed" } 

            }
        }
    }
}

2)这将只返回不包含" 有机焦虑症的数据" (其中*可以是任何单词)

{
    "query" : {
        "bool" : {
            "must_not" : [{
                    "wildcard" : {
                        "Diagnosis" : {
                            "value" : "*organic anxiety disorder*"
                        }
                    }

                }
            ]
        }
    }
}   

3)使用严格的搜索来排除数据:

{
    "query" : {
        "bool" : {
            "must_not" : [{
                    "term" : {
                        "Diagnosis.not_analyzed" : "f06.4 - organic anxiety disorder"
                    }
                }
            ]
        }
    }
}