新的弹性搜索,我需要帮助搜索过滤器。例如,我想搜索" Steven Spielberg"在meta_values.meta_value
,但仅限于meta_value.meta_name = 'director'
,而不是meta_value.meta_name = 'producer'
等等。下面的查询将匹配" steven spielberg",但它也会在{{1}时匹配}。我基本上希望这个过滤器只搜索导演。
meta_value.meta_name = 'producer'
答案 0 :(得分:0)
我猜你在elasticsearch中经历了所谓的跨对象匹配。解决方法是nested object
。
这个概念已在“Elasticsearch:The Definitive Guide"”一书中得到了很好的解释。相关章节为Nested Objects < - 点击链接进行阅读,您无需进一步阅读
基本上,如果您有这样的文档:
{
"name": "yj",
"age": 30,
"friends": [
{
"name": "jn",
"age": 28
},
{
"name": "abao",
"age": 6
}
]
}
Elasticsearch会将您的文档展平为:
{
"name": "yj",
"age": 30,
"friends.name": ["jn", "abao"],
"friends.age": [28, 6 ]
}
转型后," jn"并且28
丢失了。为避免这种情况,您可以使用Nested object
,但必须在预先映射中将该字段声明为nested
类型。几乎任何涉及嵌套对象的东西都很麻烦,因为在查询中你必须明确地说你是通过将查询声明为nested
来查询嵌套字段,并且还要对嵌套对象中的属性指定path
。
区别的原因是,nested object
是一个独立的文档,而前一个例子在转换后作为普通字段存储在文档中。
答案 1 :(得分:0)
对于这种方法,您可以使用Elasticsearch中的Query String Query功能
这样您就可以将查询框架化为如下所示
{
"query": {
"filtered": {
"query": {
"query_string": {
"query": "(meta_values.meta_value:\"Steven Spielberg\"
AND meta_value.meta_name: director)
AND NOT meta_value.meta_name: producer"
}
}
}
}
}