也许是这样的?
{
"query":{
"bool":{
"must":[
{
"term":{
"author":"one"
}
},
{
"nested":{
"path":"books",
"query":{
"term":{
"books.title":"two"
}
}
}
}
]
}
}
}
该查询基本上说文档必须具有author: one
and books.title: two
。您可以轻松地重新配置该查询。例如,如果您只想搜索作者,请删除嵌套部分。如果您想要另一本书,请更改嵌套等。
这假设您使用的是实际的嵌套文档,而不是内部对象。对于内部对象,您可以只使用完全限定的路径,而无需特殊的嵌套查询。
Edit1:您也许可以在索引时通过巧妙的提升来实现这一点,尽管它只是一个近似的解决方案。如果“作者”被大幅提升,它的排序将高于仅匹配标题,即使标题与查询的两个部分都匹配。然后,您可以使用 min_score 截止值来防止显示。
它只是一个松散的近似值,因为有些可能会通过。它也可能对“正确”匹配之间的一般排序产生奇怪的影响。
Edit2: 使用 query_string 更新以公开“单一输入”选项:
{
"query":{
"query_string" : {
"query" : "+author:one +books.title:two"
}
}
}
假设您使用的是默认的“内部对象”。如果您有真正的嵌套类型,则 query_string 会变得非常复杂:
{
"query":{
"query_string" : {
"query" : "+author:one +BlockJoinQuery (filtered(books.title:two)->cache(_type:__books))"
}
}
}
巨大的免责声明我没有测试这两个查询字符串中的任何一个,所以它们可能并不完全正确。但它们表明 Lucene 语法并不太友好。
Edit3 - 这是我最好的主意:
仔细考虑之后,您最好的解决方案可能是索引一个连接作者和书名的特殊字段。像这样的东西:
{
"author": "one",
"books": [
{
"title": "two",
},
{
"title": "three",
}
],
"author_book": [ "one two", "one three" ]
}
然后在搜索时,您可以对 Term 进行精确匹配author_book
:
{
"query" : {
"term" : {
"author_book" : "one two"
}
}
}