2016-12-28 70 views
0

映射,即时通讯试图使过滤器:Elasticsearch过滤器来匹配分析指数的阵列值的字段的

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

即使世界使用这些值的条目:我试图让

"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" 
      } 
     }   
     ] 

    } 
} 
} 

这确实给了我一些成果,但它只返回那些既有“动画”与“历史”的价值观作为他们的流派。

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

编辑: 思想像这样的工作,但它不是工作,我预计(运营商似乎并没有为我工作):

GET /test/_search 
{ 
"query": { 

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

    } 
} 
} 

回答

0

你的第一个查询是几乎正确的。如果查询genres场(即分析)如果查询genres.keyword场(即不进行分析),那么你可以使用terms查询

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

     } 
     } 
    } 
    } 
} 
} 

注意你应该使用一个match查询,而不是

POST /test/_search 
{ 
"query": { 
    "bool": { 
    "should": [{ 
     "match": { 
     "genres": "Animation" 
     } 
     } 
    },{ 
     "match": { 
     "genres": "History" 
     } 
     } 
    }] 
    } 
} 
} 

:在ES 2.x和更早版本中使用了not_analyzed,从ES 5开始,使用keyword类型是等效的。

+0

我越来越沮丧没有找到答案,这解决了我的问题。谢谢! – Edgar

+0

很高兴帮助! – Val