假设我在elasticsearch中有一个索引,其中包含两个字段:title
和tags
。我那里的文件很少
应该通过查询
返回{ title: "My main title on this page", tags: ["first", "whatever"] }
不应该通过查询返回
{ title: "My on this page", tags: ["first", "page", "whatever"] }
应该通过查询
返回{ title: "My main title on this page", tags: ["page", "whatever"]}
我想查找所有标题为CONTAINS
“主标题”AND
标记“第一个”OR
“页面”的文档。
我想用java API
来做这件事,但我不知道怎么能这样做。我知道我可以使用过滤查询来创建“or
”和“and
”。不知道如何添加查询标题部分,以及如何获得“列表中至少一个”的逻辑。
有什么想法吗?
答案 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();