2015-03-24 6 views
0

В настоящее время я довольно запутался в структурировании запросов в эластичных. Поясню, что я имею в виду следующий шаблон, который отлично работает для меня:Elastic (search): Как правильно структурировать вложенные запросы?

{ 
"template" : { 
    "query" : { 
     "filtered" : { 
      "query" : { 
       "bool" : { 
        "must" : [ 
         { "match" : { 
          "user" : "{{param_user}}" 
         } }, 
         { "match" : { 
          "session" : "{{param_session}}" 
         } }, 
         { "range" : { 
          "date" : { 
           "gte" : "{{param_from}}", 
           "lte" : "{{param_to}}" 
          } 
         } } 
        ] 
       } 
      } 
     } 
    } 
} 
} 

Ok, поэтому я хочу, чтобы получить записи конкретного сеанса пользователя, в течение определенного периода времени. Теперь, если вы берете llok по этой ссылке http://www.elastic.co/guide/en/elasticsearch/guide/current/combining-filters.html вы можете найти следующий запрос:

{ 
"query" : { 
    "filtered" : { 
    "filter" : { 
     "bool" : { 
      "should" : [ 
      { "term" : {"price" : 20}}, 
      { "term" : {"productID" : "XHDK-A-1293-#fJ3"}} 
      ], 
      "must_not" : { 
      "term" : {"price" : 30} 
      } 
     } 
    } 
    } 
} 
} 

В этом примере мы имеем право после "filtered""filter" ключевого слова. Однако, если я обменяю свой второй "query" на "filter", как в примере, мой шаблон больше не будет работать. Это действительно противоречиво, и я потратил много времени, чтобы понять это. Кроме того, я не понимаю, почему мы должны утихомиривать ФИЛЬТР В ОТДЕЛЬНЫХ ̶ ̶ ̶{̶ ̶}̶, даже если они уже отделилась решеткой ̶s̶y̶n̶t̶a̶x̶.̶

Другой вопрос, у меня было, что я предложил, чтобы соответствовать несколько полей я могу просто набираете как чего-л:

{ 
"query" : { 
    "match" : { 
     "user" : "{{param_user}}", 
     "session" : "{{param_session}}" 
    } 
} 
} 

, но казалось, что я должен использовать булев запрос, который я не знал, так что я искал «упругим мульти матч», но есть что-то совсем другое.

Мой вопрос: где я могу найти, как правильно структурировать запрос (smth как PEG)? Документация дает только базовые примеры, но не указывает, что мы можем на самом деле делать и как.

С наилучшими пожеланиями, Jan

Edit: Ok я только что нашел случайно, что я не могу обменять "query" с "filter" в "match" является запросом, а не фильтр. Но опять же, что насчет "range"? Кажется, это запрос, а также фильтр ... Есть ли резюме ключевых слов, определяющих, в каком контексте они могут быть использованы?

ответ

0

Есть ли резюме ключевых слов, определяющих, в каком контексте они могут использоваться?

Я бы не считал это keywords. Просто есть как запросы, так и фильтры с одинаковыми именами (но не все).

Here все, что вам нужно. Например, есть и запрос и фильтр range. Все, что вам нужно, это понять разницу между фильтрами и запросами.

Например, если вы хотите переместить раздел range из запроса в фильтр, вы можете сделать это, как показано в приведенном ниже коде (не проверен). Так как ваш код уже содержит тип запроса filtered, вы можете просто создать раздел filter сразу после раздела query.

{ 
    "template": { 
     "query": { 
      "filtered": { 
       "query": { 
        "bool": { 
         "must": [ 
          { 
           "match": { 
            "user": "{{param_user}}" 
           } 
          }, 
          { 
           "match": { 
            "session": "{{param_session}}" 
           } 
          } 
         ] 
        } 
       }, 
       "filter": { 
        "range": { 
         "date": { 
          "gte": "{{param_from}}", 
          "lte": "{{param_to}}" 
         } 
        } 
       } 
      } 
     } 
    } 
} 

Просто помните, что вы можете выбирать только не проанализированные поля.

+0

Хорошо, это делает больше смысла. Я не очень хорошо понимал разницу между фильтром и запросом.Помог мне много, но я боюсь, что ваша ссылка сломана;) – Jan

+0

Исправлено. Просто на самом деле не скопировал ссылку: P В любом случае это просто документы Elasticsearch. ;-) Вы можете видеть запросы и фильтры, доступные там. Как только вы получите представление о вложенных запросах/фильтрах, он станет очень простым в использовании. –

+0

Да, я вижу. Таким образом, идея состоит в том, чтобы использовать запросы для уменьшения размера выбранных документов (только соответствующие), и фильтры затем используются, чтобы сузить их еще больше в зависимости от того, чего хочет пользователь? – Jan

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