2016-09-23 3 views
0

У меня есть документ, который выглядит следующим образом:Elasticsearch - построение запросов - это правильный способ сделать это?

{ 
    "foo": { 
    "orgnr": "1" 
    }, 
    "bar": { 
    "orgnr" : "2" 
    }, 
    "created": "2015-02-12", 
    ... 
} 

У меня есть API, где пользователь может запросить для:

  • orgnr (обязательно)
  • роли (по желанию) - ЛЮБАЯ по умолчанию Любое средство должно соответствовать хотя бы одному из bar.orgnr или foo.orgnr, но также может быть роли: BAR, а затем оно должно соответствовать bar.orgnr:
  • создано (необязательно)
  • запрос (необязательно)

Orgnr должен соответствовать foo.orgnr ИЛИ bar.orgnr, а затем может иметь много других полевые и текстовые запросы. Я сопоставляю это с запросом строки запроса. Таким образом, для запроса, где orgnr равно 1, следующая строка запроса будет генерироваться:

(foo.orgnr: 1 ИЛИ bar.orgnr: 1) И (остальная часть запроса)

Где остальные запроса может быть, например,

  • создан: [2015-01-01] к *
  • создано: [2015-01-01 к *] И * запрос *

Но я не уверен, что это на самом деле правильный путь или это делается. Чтение https://www.elastic.co/guide/en/elasticsearch/guide/current/_queries_and_filters.html делает меня небезопасным. Я мог бы также использовать логическое совпадение с обязательным условием для orgnr.

С ролью: BAR следующий запрос будет генерироваться:

(bar.orgnr: 1) и (остальная часть запроса)

Наиболее важным здесь является то, что orgnr фактически соответствует в направлении foo OR bar orgnr.
Или я должен использовать фильтр для этого вместо этого?

ответ

1

A bool query in filter context - прекрасный способ сделать это. Для этого требуется, по крайней мере, одно предложение.

POST _search 
{ 
    "query": { 
     "constant_score": { 
     "filter": { 
      "bool": { 
       "should": [ 
        { 
        "term": { 
         "foo.orgnr": "1" 
        } 
        }, 
        { 
        "term": { 
         "bar.orgnr": "1" 
        } 
        } 
       ] 
      } 
     } 
     } 
    } 
} 
+0

Это прекрасный способ, но какая разница? Я имею в виду, что построение строки запроса с AND и OR для меня является намного более симпатичным. – J2B

+1

Синтаксис запроса Lucene короче, чем синтаксис запроса запроса Elasticsearch Query, но для сложных запросов читаемость синтаксиса Lucene ниже. Если вы идете с синтаксисом Lucene и позволяете клиентам вводить поисковый запрос, тогда вам следует проявлять особую осторожность при дезинфекции ввода. – Henrik

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