Elasticsearch过滤器匹配分析索引的数组值

时间:2016-12-28 14:24:46

标签: elasticsearch

我试图过滤的字段的映射:

  "genres": {
    "type": "text",
    "fields": {
      "keyword": {
        "type": "keyword",
        "ignore_above": 256
      }
    }
  },

Theres包含以下值的条目:

  "genres": [
    "Animation",
    "History"
  ],

我正在尝试制作一个过滤器,我会输入“动画” - 它会返回所有以动画为流派的条目。

尝试使用条款

GET /test/_search
{
 "query": {
   "bool": {
     "filter": {
       "terms": {
         "genres": [
             "Animation",
             "History"
           ]

         }
       }
     }
   }
 } 
}

这导致没有条目,因为我阅读更多我看到我需要重新映射我的数据库并把“索引”:“not_analyzed” - 然后它会返回一些条目。

但是,我可以通过不使用过滤器来获得这些结果,使用类似的东西:

GET /tmdb/_search
{
 "query": {
   "bool": {
      "must" : [
        {
          "match": {
            "genres": "history"
          }
        },
        {
          "match": {
            "genres": "animation"
          }
        }          
      ]

   }
 } 
}

这确实给了我一些结果,但它只返回同时具有“动画”和“历史”作为其类型的值。

所以我的问题 - 我是否需要重新映射我的数据库,并将“index”:“not_analyzed”添加到我将使用过滤器的列中,或者我使用第二个选项(不使用过滤器)。

编辑: 想到这样的东西会起作用,但它不能像我预期的那样工作(操作员,似乎对我不起作用):

GET /test/_search
{
 "query": {

   "match": {
     "genres": {
       "query": "animation", 
       "query": "history", 
       "operator": "and"
     }

   }
 } 
}

1 个答案:

答案 0 :(得分:0)

您的第一个查询几乎是正确的。如果您查询match字段(即已分析),则应使用POST /test/_search { "query": { "bool": { "should": [{ "match": { "genres": "Animation" } } },{ "match": { "genres": "History" } } }] } } } 查询

genres.keyword

如果您查询terms字段(即未分析),则可以使用POST /test/_search { "query": { "bool": { "filter": { "terms": { "genres.keyword": [ "Animation", "History" ] } } } } } } 查询

not_analyzed

注意:{2.}}在ES 2.x及更早版本中使用,从ES 5开始,使用keyword类型是等效的。