我想使用ES进行图书搜索。因此,我决定将作者姓名和标题(作为嵌套文档)放入索引,如下所示:
curl -XPUT localhost:9200/library/search_books/1 -d'{
"author": "one",
"books": [
{
"title": "two",
},
{
"title": "three",
}
]
}'
我不明白的是:如何构造搜索查询,以便在搜索“一二”时仅找到第二本书,而在搜索“二三”时什么也找不到,而在搜索“一”时所有图书呢?
也许是这样的?
{
"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))"
}
}
}
巨大的免责声明 我没有测试这两个query_strings中的任何一个,因此它们可能并不完全正确。但是他们表明Lucene语法不是太友好了。
考虑一下之后,最好的解决方案可能是索引一个将作者和书名连接在一起的特殊字段。像这样:
{
"author": "one",
"books": [
{
"title": "two",
},
{
"title": "three",
}
],
"author_book": [ "one two", "one three" ]
}
然后,在搜索时,您可以对进行完全匹配的字词author_book
:
{
"query" : {
"term" : {
"author_book" : "one two"
}
}
}
我试图创建一个嵌套查询,它将过滤掉一些带有特定术语的文档。在本例中,我试图过滤掉在user.first中有匹配术语的文档。数据示例: 我的查询没有得到所需的结果,因为它返回给我所有未筛选的记录。我尝试使用: 我希望这里得到与过滤器不匹配的文档。在这种情况下,它应该只返回第二个文档。做这件事的正确方法是什么?
问题内容: 我在获取与Elasticsearch一起使用的嵌套查询时遇到问题(如果我删除了查询字符串之一,则可以使用)。我要解决的问题是我有一个包含关闭列表的文档(关闭)。我想在条件满足另一个值的闭包列表中搜索一个值。那只是从argan = 1的闭包中获得价值 我正在得到这个错误响应; 我的映射如下所示。 有人知道我在做什么错吗? 问题答案: 您的查询不是有效的查询。您需要使用适当的复合查询将其他
问题内容: 我正在尝试使用query_string编写查询以检索嵌套对象的数据查询。 我想做的查询的一个例子是: 其中“ a”是嵌套对象,“ id”是“ a”的字段。 我知道我可以使用嵌套查询成功地执行此任务,编写如下查询: 但是,我想避免这种情况。我不想自己弄清楚用户正在搜索嵌套字段并修改查询。我尝试使用“ fields”参数,但它似乎不适用于嵌套对象。 是否可以使用“ query_string
问题内容: 这是我在elasticsearch中存储在索引上的数据类型。我必须找到包含主要成分牛肉(且重量小于1000)和成分-(辣椒粉且重量小于250),(橄榄油和重量小于300)以及所有其他成分类似的食谱。 索引的映射是 我的查询是 但这给了Null。有人可以帮我吗?我认为我没有正确使用嵌套查询 问题答案: 试试这个:
我是elasticsearch的新手,对如何进行过滤器、查询和聚合有一些想法,但不确定如何解决下面的问题。我希望能够从下面显示的文档中只查询公司的最新交付(日期和crate_quantity)。我不确定如何去做。有没有办法使用最大聚合从每个文档中只提取最近的交付?
我正在通过jHipster使用Spring Data Elasticsearch支持,并试图更多地了解如何使用搜索来扩展数据库中的一些新关系。 我有了一个新的嵌套关系,它有自己的索引: 我想将结果筛选到特定用户“friend1.id”,并在嵌套文档上搜索匹配的详细信息? 但这似乎没有返回任何结果?