2016-08-29 4 views
0

У меня это отображение на ES 1.7.3:Поиск на полях вложенного объекта на elasticsearch

{ 
    "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": {} 
    } 
} 

Пружина приложение генерирует этот запрос:.

{ 
    "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 
      } 
     } 
     } 
    } 
} 

, на котором «адреса * : sample * " - единственный вход.

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

Код выше работает, но ищет все поля объекта заказчика. Так как я хочу, чтобы искать только на полях адреса Я использовал «адреса. *»

запросов работает только если поля объекта адреса имеют строковый тип и, прежде чем я добавил долготу и широта полей двойного типа на адресном объекте. Теперь ошибка возникает из-за этих двух новых полей.

Ошибка:

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" поля внутри вложенного объекта с помощью адресов * только.?

ответ

0

Решение было добавить «мягкий»: истинный. В соответствии с документацией: https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-query-string-query.html

lenient - Если установлено значение true, это приведет к игнорированию ошибок на основе формата (например, предоставление текста в числовое поле).