ElasticSearch Bool Fitler似乎没有使用字符串术语

时间:2016-10-17 11:37:46

标签: elasticsearch foselasticabundle booleanquery

我正在尝试使用布尔过滤器执行查询,但似乎在类型为字符串时它不起作用。

示例:

当我将此有效负载发送到我的_search端点时:

{
    "query": {
        "filtered": {
            "filter": {
                "bool": {
                    "must": [
                        { "term": { "level" : 3 } },
                        { "term": { "id" : 4 } }
                    ]
                }
            }
        }
    }
}

结果是:

{
  "took": 29,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 1,
    "hits": [
      {
        "_index": "app",
        "_type": "reviewable",
        "_id": "4",
        "_score": 1,
        "_source": {
          "id": 4,
          "name": "Hololens Bootcamp Experience",
          "providers": [],
          "gender": [],
          "duration": "3",
          "category": "COURSE",
          "themes": [],
          "baseThemes": [],
          "budget": "1000+",
          "language": "EN",
          "level": "3",
          "region": "NL_BR",
          "subscribemethod": "2",
          "kind": "2"
        }
      }
    ]
  }
}

然后当我尝试用这样的语言术语过滤它时:

{
    "query": {
        "filtered": {
            "filter": {
                "bool": {
                    "must": [
                        { "term": { "level" : 3 } },
                        { "term": { "id" : 4 } },
                        { "term": { "language" : "EN" } }
                    ]
                }
            }
        }
    }
}

我的结果有0次点击:

{
  "took": 11,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 0,
    "max_score": null,
    "hits": []
  }
}

这对我来说似乎很奇怪,因为你可以在我的第一个结果中看到过滤器应该匹配我的数据。

我有搜索,一篇文章提到我可能没有索引的所有内容。但据我所知,我当然有。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

您的语言字段很可能是一个已分析的字符串,因此EN被标记化并编入索引为en,因此您的查询应该是这样的:

{
    "query": {
        "filtered": {
            "filter": {
                "bool": {
                    "must": [
                        { "term": { "level" : 3 } },
                        { "term": { "id" : 4 } },
                        { "term": { "language" : "en" } }   <--- lowercase here
                    ]
                }
            }
        }
    }
}

另一种方法是使用match查询,但不包含对您的情况无用的包装filtered查询:

{
    "query": {
         "bool": {
             "must": [
                 { "term": { "level" : 3 } },
                 { "term": { "id" : 4 } },
                 { "match": { "language" : "EN" } }
             ]
         }
    }
}