排除Elasticsearch查询中的字段

时间:2016-09-12 13:38:40

标签: elasticsearch

具有以下映射:

curl -XPUT 'localhost:9200/testidx?pretty=true' -d '{
  "mappings": {
    "items": {
       "dynamic": "strict",
       "properties" : {
            "title" : { "type": "string" },
            "body" : { "type": "string" }
}}}}'

我把两件物品放在上面:

curl -XPUT 'localhost:9200/testidx/items/1' -d '{
  "title": "Titulo anterior",
  "body": "blablabla blablabla blablabla blablabla blablabla blablabla"
}'

curl -XPUT 'localhost:9200/testidx/items/2' -d '{
  "title": "Joselr",
  "body": "Titulo stuff more stuff" 
}'

现在我想在titulo的每个字段上搜索单词body,所以我所做的是(this帖子之后):

curl -XGET 'localhost:9200/testidx/items/_search?pretty=true' -d '{
    "query" : {
         "query_string": {
              "query": "Titulo"
         }},
         "_source" : {
              "exclude" : ["*.body"]
         }
    }'

它应该只显示1项目,因为第二个项目有Titulo,但它位于body上,这就是我想要忽略的内容。如何存档?

PS:这只是一个简单的例子,我有很多属性的映射,我想在一些搜索中忽略其中的一些。
PS2:我正在使用ES 2.3.2

2 个答案:

答案 0 :(得分:2)

_source/exclude设置仅对不在响应中返回body字段有用,但不排除该字段被搜索。

您可以做的是指定要搜索的所有字段(白名单方法)

curl -XGET 'localhost:9200/testidx/items/_search?pretty=true' -d '{
  "query" : {
     "query_string": {
          "fields": ["title", "field2", "field3"],      <-- add this
          "query": "Titulo"
     }},
     "_source" : {
          "exclude" : ["*.body"]
     }
}'

您可以做的另一件事是明确指定body不应与-body:Titulo匹配

curl -XGET 'localhost:9200/testidx/items/_search?pretty=true' -d '{
  "query" : {
     "query_string": {
          "query": "Titulo AND -body:Titulo"                <-- modify this
     }},
     "_source" : {
          "exclude" : ["*.body"]
     }
}'

答案 1 :(得分:0)

最多elasticsearch 6.0.0可以将"include_in_all": false设置为索引字段属性,例如https://www.elastic.co/guide/en/elasticsearch/reference/5.5/include-in-all.html

(这当然需要对数据进行重新索引。)