我对ElasticSearch非常陌生,如何编写一个查询,在文档的所有字段中搜索一个关键字(即test关键字),并在一个特定字段中再搜索一个关键字。
这可以使用 query_string
但是我们不能在指定了嵌套字段的嵌套字段中进行搜索,所以我使用luqum将lucene查询转换为elasticsearch dsl。
下面是示例用例:
我有一个Map:
"mappings": {
"properties": {
"grocery_name":{
"type": "text"
},
"items": {
"type": "nested",
"properties": {
"name": {
"type": "text"
},
"stock": {
"type": "integer"
},
"category": {
"type": "text"
}
}
}
}
}
}
数据如下所示
{
"grocery_name": "Elastic Eats",
"items": [
{
"name": "Red banana",
"stock": "12",
"category": "fruit"
},
{
"name": "Cavendish banana",
"stock": "10",
"category": "fruit"
},
{
"name": "peach",
"stock": "10",
"category": "fruit"
},
{
"name": "carrot",
"stock": "9",
"category": "vegetable"
},
{
"name": "broccoli",
"stock": "5",
"category": "vegetable"
}
]
}
如何查询以获取商品名称与杂货店香蕉名称匹配的所有商品?
试用 *
以及 _all
,没用。
查询示例:
{
"query": {
"bool": {
"must": [
{
"match_phrase": {
"grocery_name": {
"query": "Elastic Eats"
}
}
},
{
"match": {
"*": {
"query": "banana",
"zero_terms_query": "all"
}
}
}
]
}
}
}
我肯定我错过了一些明显的东西,但我已经读过手册,我一点也不高兴。
更新:启用 include_in_parent
for嵌套对象适用于下面的查询,但它会在内部复制数据,这肯定会影响内存。
{
"query": {
"bool": {
"must": [
{
"match_phrase": {
"grocery_name": {
"query": "Elastic Eats"
}
}
},
{
"multi_match": {
"query": "banana"
}
}
]
}
}
}
还有别的办法吗?
1条答案
按热度按时间ru9i0ody1#
您需要使用带有内部\u点击的嵌套匹配查询,从而生成一个内部嵌套查询来自动匹配相关的嵌套级别,而不是根
搜索查询
搜索结果:
更新1:
根据您的评论,您可以针对您的用例使用multi-match查询
如果未提供任何字段,则multi\u match查询默认为index.query.default\u field index settings,后者又默认为*。
(*)提取Map中符合术语查询条件的所有字段,并筛选元数据字段。然后合并所有提取的字段以构建查询。
搜索查询:
更新2:
您需要使用多个bool查询的组合,如下所示: