我正在使用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](仅在两个或更多peole的照片中拉动)
tags.tag_id:[1,2,3](仅在具有全部三个或更多标签的照片中拉出)
by_line:“John D. Kealy /我的Website.com”(全名,包括斜杠)
地点:“西部某处”
我想用所有这些项目写一个查询。我需要在“by_line”中包含斜杠,我不在乎大写或小写。我需要完全匹配的“西边某个地方”。我在这里用什么?查询或过滤器/已过滤?
最佳答案
bool(boolean) 过滤器/查询的一般准则可以在here中找到。
如果要构建“完全匹配”查询,则通常可以使用term过滤器(或查询)。
如果要构建一个需要可靠的性能速度搜索的搜索,建议使用filtered query,因为在运行查询之前设置了过滤器,通常可以提高性能。
对于您的特定示例,以下过滤器应该可以工作,将其放在matchAll查询或您需要的其他任何内容上(使用未分析的by_line字段,被分析的对象将具有查询)。这应该使您了解如何构造将来的查询:
注意:这假定未分析您的by_line字段。如果使用的是分析字段,则必须使用匹配查询,双斜杠将转义您的斜杠定界符。
在by_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"}}
]
}
}
}
}
}
我将在上面保留这些内容,以供将来的读者使用,但是在您的帖子历史记录中,您看到您正在使用标准分析器,您的查询应按以下结构进行。
在分析仪上by_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"}}
]
}
}
}
}
}
关于elasticsearch - 如何对高级查询使用 Elasticsearch :,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31525391/