典型的Elasticsearch JSON响应类似于:
[
{
"_index": "articles",
"_id": "993",
"_score": 10.443843,
"_source": {
"title": "This is a test title",
"authors": [
{
first_name: 'john',
last_name: 'smith'
},
我如何查询其中一个作者是'约翰史密斯'的所有文章?目前我有:
const {
hits: { hits }
} = await client.search({
index: "articles",
body: {
query: {
bool: {
should: [
{
match: {
"authors.first_name": "john"
}
},
{
match: {
"authors.first_name": "Smith"
}
}
]
}
}
}
});
但这将返回名或姓为john或smith的文章,而不是作者为“john smith”的文章。
2条答案
按热度按时间vs91vp4v1#
我认为您在这里遇到的是nested vs. object dilemma,您可以通过将
authors
字段的类型更改为嵌套类型(您没有共享您的索引Map,所以我在这里假设)并使用以下查询来实现您所寻找的内容希望能有所帮助。
du7egjpx2#
在这种情况下,您使用了“应该”语句,可以解释为
这可以很容易地用“必须”来代替,这可以解释为
正如rob在他的回答中提到的,嵌套的vs对象确实是一个难题。
但当你处理信息数组时就会出现这种困境。
例如,您有以下条目
条目#1
然后执行以下搜索
你将在文档中有一个匹配,因为因为firstName和lastName都匹配你的文档,即使他们在不同的用户对象中匹配。2这是一个对象Map的例子。
在这种情况下,没有解决办法,您必须使用NESTEDMap来完成自然匹配。
在您的特定情况下,我认为您不会遇到这种情况,所以使用OBJECT和MUST(AND而不是should(OR))查询应该可以做得很好。
如果你需要进一步的解释,让我知道我会做一个更详细的编辑。
干杯。