2015-10-20 2 views
0

Как проверить, являются ли мои условия запроса ключами в одном из моих полей? Например, здесь хранится документ:Запрос, если ключ существует в хеше ElasticSearch

{ 
    field1: "some value", 
    field2: "some other value", 
    field3: { 
    something: [1,2], 
    else: [2,3] 
    } 
} 

Запрос «что-то» должен вернуть этот документ. Запрос «некоторое значение» также должен вернуть этот документ. Вот то, что я до сих пор:

{ 
    query: { 
    filtered: { 
     query: { 
     multi_match: { 
      query: query, 
      fields: ['field1', 'field2'], 
      operator: 'and' 
     } 
     }, 
     filter: { 
     or: [ 
      { 
      exists: { field: "field3"} 
      } 
     ] 
     } 
    } 
    } 
} 

ответ

0

Предполагая, что вы хотите «некоторое значение», в adjesent моды, должно работать нормально -

{ 
    "query": { 
    "filtered": { 
     "filter": { 
     "exists": { 
      "field": "field3" 
     } 
     }, 
     "query": { 
     "bool": { 
      "should": [ 
      { 
       "bool": { 
       "must": [ 
        { 
        "match_phrase": { 
         "field1": "some value" 
        } 
        }, 
        { 
        "match_phrase": { 
         "field2": "some value" 
        } 
        } 
       ] 
       } 
      }, 
      { 
       "multi_match": { 
       "query": "something", 
       "fields": [ 
        "field1", 
        "field2" 
       ], 
       "operator": "and" 
       } 
      } 
      ] 
     } 
     } 
    } 
    } 
} 
+0

Я вынул часть 'match_phrase', потому что я не передаю разные термины запроса в разные поля (т. Е. Одни и те же термины запрашиваются во всех полях). Также это не работает. Я получаю ошибку: 'Запрос не зарегистрирован для [существует]'. :( – user3325749

+0

Я исправил запрос, теперь вы можете попробовать. –

+0

Запрос «что-то» возвращает этот документ только потому, что 'match_phrase' соответствует другой строке. Удаление вложенного bool не возвращает документ. – user3325749

0
{ 
    query: { 
    filtered: { 
     filter: { 
     or: [ 
      { 
      query: { 
       multi_match: { 
       query: query, 
       fields: ['field1', 'field2'], 
       operator: "and" 
       } 
      } 
      }, 
      { 
      exists: { field: "field3.query" } 
      } 
     ] 
     } 
    } 
    } 
} 

Единственный нюанс в том, что если query является строка с несколькими терминами (или массивом), вам нужно будет создать фильтр exists для каждого термина.

Смежные вопросы