如何使用弹性搜索高级查询:

时间:2015-07-20 20:05:37

标签: elasticsearch

我正在使用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"中包含斜杠,我不在乎大写或小写。我需要完全匹配"有些地方在西边"。我在这里用什么?查询或过滤/过滤?

1 个答案:

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