我正在使用elasticsearch。我已经非常深入了解它,但我对如何编写高级查询感到非常困惑。有查询/过滤器/等等。我对如何进行感到困惑。
我的架构看起来像这样:
photos: {people: [{person_id: 1, person_name:"john kealy"}],
tags: [{tag_id: 1, tag_name:"other tag"},
by_line: "John D Kealy/My website.com",
location: "Some Place OUt West"]
我需要能够动态地将这些查询串在一起,总是拉入全部匹配,例如,我想搜索
people.person_id:[1,2](只带有两个或更多人的照片) tags.tag_id:[1,2,3](仅包含所有三个或更多标签的照片) by_line:" John D. Kealy /我的Website.com" (包括斜杠的全名) 位置:"西边的一些地方"
我想用所有这些项写一个查询。我需要在" by_line"中包含斜杠,我不在乎大写或小写。我需要完全匹配"有些地方在西边"。我在这里用什么?查询或过滤/过滤?
答案 0 :(得分:1)
可以找到bool过滤器/查询的一般准则here。
如果您要构建“完全匹配”查询,则通常可以使用term过滤器(或查询)。
如果您正在构建一个需要明智的性能速度的搜索,那么通常建议使用filtered query,因为在运行查询之前设置过滤器,通常可以提高性能。
至于你的具体例子,下面的过滤器应该可以工作,把它扔到matchAll查询或你需要的任何其他东西[使用未分析的by_line字段,分析的有一个查询)。这应该可以让您了解如何构建未来的查询:
注意:这假设您的by_line字段未分析。双斜杠将转义斜杠分隔符,如果您使用的是分析字段,则必须使用匹配查询。
没有分析器on_line
{
"query" : {
"filtered" : {
"filter" : {
"bool" : {
"must" : [
{ "terms" : {"people.person_id" : ["1", "2"]}},
{ "terms" : {"tags.tag_id" : ["1", "2", "3"]}},
{ "term" : {"by_line" : "John D. Kealy\\/My Website.com"}},
{ "term" : {"location" : "some place out west"}}
]
}
}
}
}
}
我将为未来的读者保留上述内容,但是我在您的帖子历史中看到您使用的是标准分析器,您的查询结构应如下所示。
使用分析器on_line
{
"query" : {
"filtered" : {
"query": {
"match": {
"by_line": "John Kealy/BFA.com"
}
},
"filter" : {
"bool" : {
"must" : [
{ "terms" : {"people.person_id" : ["1", "2"]}},
{ "terms" : {"tags.tag_id" : ["1", "2", "3"]}},
{ "term" : {"location" : "some place out west"}}
]
}
}
}
}
}