我试图过滤的字段的映射:
"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"
}
}
}
}
答案 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
类型是等效的。