Elasticsearch:使用过滤器构造布尔查询
我有以下文件结构:Elasticsearch:使用过滤器构造布尔查询,search,
elasticsearch,Search,
elasticsearch,我有以下文件结构: Movie: { id: int, title: string, language: string, genre: string, description: string, cast: array[string], directors: array[string], (...) } 现在,在web界面中,用户可以选中语言、流派、导演等复选框,并在搜索框中键入一些查询 比如说,我想在所有惊悚片类型中搜索,都是法语
Movie:
{
id: int,
title: string,
language: string,
genre: string,
description: string,
cast: array[string],
directors: array[string],
(...)
}
现在,在web界面中,用户可以选中语言、流派、导演等复选框,并在搜索框中键入一些查询
比如说,我想在所有惊悚片类型中搜索,都是法语或英语,由詹姆斯·卡梅隆或乔治·卢卡斯导演导演,我在搜索框中键入abc,我想在标题或描述中找到
因此,我想要的是:
-只有法语或英语的电影
-只有詹姆斯·卡梅隆或乔治·卢卡斯导演的电影
-只有惊悚片
-与abc相对应的电影
我不确定如何在过滤器中执行OR,但我从以下内容开始:
curl -X -XGET 'localhost:9200/movies/_search?pretty' -H 'Content-Type: application/json' -d'
{
"query" : {
"constant_score" : {
"filter" : {
"bool" : {
"should" : [
{ "term" : {"language" : "french"}},
{ "term" : {"language" : "english"}},
{ "term" : {"directors" : "James Cameron"}},
{ "term" : {"directors" : "George Lucas"}}
],
"filter" : [
{ "term" : {"genre" : "thriller"}}
]
}
}
}
}
}
'
您能给我一些提示吗?据我所知,您需要这样的查询:语言是a或B,导演是C或D,体裁是E,标题或描述是F。在这种情况下,您需要以下查询:
{
"query": {
"bool": {
"filter": [
{
"terms": {
"language": [
"french",
"english"
]
}
},
{
"bool": {
"should": [
{
"match": {
"directors": "James Cameron"
}
},
{
"match": {
"directors": "George Lucas"
}
}
]
}
},
{
"term": {
"genre": "thriller"
}
},
{
"multi_match": {
"query": "abc",
"fields": [
"title",
"description"
]
}
}
]
}
}
}
筛选查询将按和条件工作,但将为所有匹配的文档获得相同的分数。如果您需要根据子查询匹配情况改变分数,最好使用must而不是filter。如果指定的字段至少包含一个术语,则术语查询将匹配。如果至少有一个字段包含指定的查询,则多匹配查询将匹配非常感谢!我唯一的问题是在董事身上过滤——它不起作用,永远不会返回任何结果。对于数组字段,筛选器是否应该不同?如果使用默认分析器,请尝试匹配查询而不是术语。它将首先生成术语,并将它们用于搜索更新我的答案与匹配查询与匹配它的作品像一个魅力。非常感谢。顺便说一句,我已经意识到,如果查询中有3个以上的过滤器,那么对ES的查询在ES中没有响应/没有日志。将过滤器的数量限制为3个工程。。。你有过这个问题吗?没有,应该可以。您可以将详细信息作为单独的问题发布