在 elasticsearch 上搜索嵌套对象的字段

Searching on fields of a nested object on elasticsearch

我在 ES 1.7.3 上有这个映射:

{
   "customer": {
      "aliases": {},
      "mappings": {
         "customer": {
            "properties": {
               "addresses": {
                  "type": "nested",
                  "include_in_parent": true,
                  "properties": {
                     "address1": {
                        "type": "string"
                     },
                     "address2": {
                        "type": "string"
                     },
                     "address3": {
                        "type": "string"
                     },
                     "country": {
                        "type": "string"
                     },
                     "latitude": {
                        "type": "double",
                        "index": "not_analyzed"
                     },
                     "longitude": {
                        "type": "double",
                        "index": "not_analyzed"
                     },
                     "postcode": {
                        "type": "string"
                     },
                     "state": {
                        "type": "string"
                     },
                     "town": {
                        "type": "string"
                     },
                     "unit": {
                        "type": "string"
                     }
                  }
               },
               "companyNumber": {
                  "type": "string"
               },
               "id": {
                  "type": "string",
                  "index": "not_analyzed"
               },
               "name": {
                  "type": "string"
               },
               "status": {
                  "type": "string"
               },
               "timeCreated": {
                  "type": "date",
                  "format": "dateOptionalTime"
               },
               "timeUpdated": {
                  "type": "date",
                  "format": "dateOptionalTime"
               }
            }
         }
      },
      "settings": {
         "index": {
            "refresh_interval": "1s",
            "number_of_shards": "5",
            "creation_date": "1472372294516",
            "store": {
               "type": "fs"
            },
            "uuid": "RxJdXvPWSXGpKz8pdcF91Q",
            "version": {
               "created": "1050299"
            },
            "number_of_replicas": "1"
         }
      },
      "warmers": {}
   }
}

spring 应用程序生成此查询:

{
   "query": {
      "bool": {
         "should": {
            "query_string": {
               "query": "(addresses.\*:sample* AND NOT status:ARCHIVED)",
               "fields": [ 
                   "type",
                    "name",
                    "companyNumber",
                    "status",
                    "addresses.unit",
                    "addresses.address1",
                    "addresses.address2",
                    "addresses.address3",
                    "addresses.town",
                    "addresses.state",
                    "addresses.postcode",
                    "addresses.country"
                ],
               "default_operator": "or",
               "analyze_wildcard": true
            }
         }
      }
   }
}

其中 "addresses.*:sample*" 是唯一的输入。

"query": "(sample* AND NOT status:ARCHIVED)"

上面的代码有效,但会搜索客户对象的所有字段。 因为我只想搜索地址字段,所以我使用了 "addresses.*"

仅当地址对象的字段是 String 类型并且在我添加 longitudelatitude double 类型的字段之前,查询才有效在地址对象上。现在由于这两个新字段而发生错误。

错误:

Parse Failure [Failed to parse source [{
   "query": {
     "bool": {
        "should": {
            "query_string": {
               "query": "(addresses.\*:sample* AND NOT status:ARCHIVED)",
                  "fields": [ 
                      "type",
                      "name",
                      "companyNumber","country",
                      "state",
                      "status",
                      "addresses.unit",
                      "addresses.address1",
                      "addresses.address2",
                      "addresses.address3",
                      "addresses.town",
                      "addresses.state",
                      "addresses.postcode",
                      "addresses.country",
                  ],
                  "default_operator": "or",
                  "analyze_wildcard": true
              }
          }
      }
    }
  }
]]

NumberFormatException[For input string: "sample"

是否可以使用 地址搜索嵌套对象中的 "String" 字段。* 仅?

解决方案是添加 "lenient": true。根据文档:https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-query-string-query.html

lenient - 如果设置为 true 将导致基于格式的失败(例如向数字字段提供文本)被忽略。