【问题标题】:Querying nested document Elasticsearch查询嵌套文档 Elasticsearch
【发布时间】:2013-03-29 20:29:30
【问题描述】:

我正在学习 Elasticsearch,所以我不确定这个查询是否正确。我检查了数据是否已编入索引,但我没有得到任何点击。我究竟做错了什么?这不应该在创作者的名字是史蒂夫的汽车上受到打击吗?

builder
.startObject()
    .startObject("car")
        .field("type", "nested")
        .startObject("properties")
            .startObject("creators")
                .field("type", "nested")                    
            .endObject()                
        .endObject()
    .endObject()
.endObject();


{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "car.creators.name": "Steve"
          }
        }
      ],
      "must_not": [],
      "should": []
    }
  },
  "from": 0,
  "size": 50,
  "sort": [],
  "facets": {}
}

【问题讨论】:

    标签: java jakarta-ee full-text-search elasticsearch


    【解决方案1】:

    首先,为了搜索嵌套字段,您需要使用nested query

    curl -XDELETE localhost:9200/test
    curl -XPUT localhost:9200/test -d '{
        "settings": {
            "index.number_of_shards": 1,
            "index.number_of_replicas": 0
        },
        "mappings": {
                "car": {
                    "properties": {
                        "creators" : {
                            "type": "nested",
                            "properties": {
                                "name": {"type":"string"}
                            }
                        }
                    }
                }
            }
        }
    }
    '
    curl -XPOST localhost:9200/test/car/1 -d '{
        "creators": {
            "name": "Steve"
        }
    }
    '
    curl -X POST 'http://localhost:9200/test/_refresh'
    echo
    curl -X GET 'http://localhost:9200/test/car/_search?pretty' -d '    {
        "query": {
            "nested": {
                "path": "creators",
                "query": {
                    "bool": {
                        "must": [{
                            "match": {
                                "creators.name": "Steve"
                            }
                        }],
                        "must_not": [],
                        "should": []
                    }
                }
            }
        },
        "from": 0,
        "size": 50,
        "sort": [],
        "facets": {}
    }
    '
    

    如果car.creators.name 是使用标准分析器索引的,那么{"term": {"creators.name": "Steve"}} 将找不到任何内容,因为单词Steve 被索引为steveterm query 不执行分析。因此,最好将其替换为 match query {"match": {"creators.name": "Steve"}}

    【讨论】:

    • 谢谢!我不得不将路径字段移出查询对象,并在路径中插入“创建者”,并且只在术语中使用 creators.name。这听起来是错误的还是正确的?
    • 是的,你是对的。路径应与查询处于同一级别,并且应包含“car.creators”。我已经更新了这个例子。不确定该术语中的 creators.name。在你的情况下,汽车是一种类型吗?
    • 是的,汽车是一种类型?由于我正在学习 Elasticsearch,您是否介意解释一下为什么我不需要它并且您设法让它与它一起工作?
    • 我只是糊涂了。当我在car 下看到"type": "nested" 时,我认为car 是一个字段。如果car 是一种类型,则不需要"type": "nested",是的,您需要在查询中使用creators.name。我修改了我的示例以使用 car 作为类型。
    • 类型在“路径”元素中是可选的。它可以在那里,但因为我已经在 url 上指定了类型,所以没有必要。嵌套查询中不应出现类型。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-22
    • 2021-07-21
    • 2018-05-10
    • 1970-01-01
    • 2017-10-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多