带有两个字段和“AND”过滤器的ElasticSearch查询 - Java API

时间:2015-07-06 20:39:49

标签: java elasticsearch java-api

假设我在elasticsearch中有一个索引,其中包含两个字段:titletags。我那里的文件很少

  1. 应该通过查询

    返回
    { title: "My main title on this page", tags: ["first", "whatever"] }
    
  2. 不应该通过查询返回

    { title: "My on this page", tags: ["first", "page", "whatever"] }
    
  3. 应该通过查询

    返回
    { title: "My main title on this page", tags: ["page", "whatever"]}
    
  4. 我想查找所有标题为CONTAINS“主标题”AND标记“第一个”OR“页面”的文档。 我想用java API来做这件事,但我不知道怎么能这样做。我知道我可以使用过滤查询来创建“or”和“and”。不知道如何添加查询标题部分,以及如何获得“列表中至少一个”的逻辑。

    有什么想法吗?

1 个答案:

答案 0 :(得分:1)

这取决于你是否关心“主要”和“标题”单词的顺序(这是一个短语),但这相对简单:

{
  "query" : {
    "bool" : {
      "must" : [
        {
          "match_phrase" : {
            "title" : "main title"
          }
        },
        {
          "terms" : {
            "tags" : [ "first", "page" ]
          }
        }
      ]
    }
  }
}

默认情况下,terms查询将作为单个匹配项运行,它将通过匹配多个标记来提高分数(相关性)。这将执行完全匹配,您应该使用not_analyzed字符串。 must中的任何内容都会与AND本身相似;你可以理解bool query/filter by checking here。这很简单地转换为Java API:

import static org.elasticsearch.index.query.QueryBuilders.*;

SearchResponse response =
    client.prepareSearch("your-index").setTypes("your-type")
          .setQuery(
               boolQuery()
                   .must(matchPhraseQuery("title", "main title"))
                   .must(termsQuery("tags", "first", "page"))
          .execute()
          .actionGet();