2012-08-08 5 views
1

У меня есть некоторые данные, как и в elasticsearch:Возвращаясь пользовательское поле, где значение зависит от запроса в elasticsearch

account (http://localhost:9200/myapp/account/1) 
======== 
name 
state 
groups //groups is an array containing objects like so {id: 1, starred: true} 
     //the id is the id of the group type 

email (http://localhost:9200/myapp/email/1?parent=1) 
======== 
email 
primary //just a boolean to denote whether this email is primary or not 

group 
======== 
name 
description 

email s дети account.

на основе imotov's excellent answer, я могу запустить поиск по account.name и email.email и вернуть ВСЕ account сек, где искомый префикс соответствует выше 2 поля:

{ 
    "query": { 
    "bool": { 
     "must": [ 
     { 
      "term": { 
      "statuses": "active" 
      } 
     } 
     ], 
     "should": [ 
     { 
      "prefix": { 
      "name": "a" 
      } 
     }, 
     { 
      "has_child": { 
      "type": "email", 
      "query": { 
       "prefix": { 
       "email": "a" 
       } 
      } 
      } 
     } 
     ], 
     "minimum_number_should_match" : 1 
    } 
    } 
} 

То, что я хотел бы сделать сейчас, чтобы вернуть 2 пользовательские поля для каждого результата:

  • для каждого результата возвращают поле, называемое email, если поиск был подобран на email типа (который ребенок account), верните это письмо, в противном случае верните адрес электронной почты primary, связанный с учетной записью, если нет, null может быть возвращен.

  • Для каждого результата возвратите поле под названием group. Значение поля должно содержать имя выделенного group, идентификатор которого хранится в массиве groups. По существу: найдите group.id, где group.starred истинно в каждом account.groups, затем верните соответствие group.name из базы group по идентификатору, который мы нашли.

Я смотрел на script fields, но я не уверен, что он способен вернуть поля для каждого удара. Я также не уверен, действительно ли это выше в ES.

Может ли кто-нибудь указать некоторые рекомендации относительно того, возможно ли это и как начать работу?

ответ

1

В настоящее время нет простого доступа к данным в статье has_child или nested.

Единственное решение - получить некоторые данные, принять некоторые решения на клиенте, а затем получить больше данных.

Вот что я сделал, чтобы достичь этого:

  • Выполните запрос выше и получить обратно данные.

  • Чтобы справиться с указанием соответствия сообщений электронной почты или основной адрес электронной почты (запустить от типа почты):

    {"query": 
        {"bool":{ 
         "should":{ 
         { 
          "prefix":{ 
           "email" : "the query" 
          } 
         }, 
         { 
          "terms":{ 
           "_parent" : ["list", "of", "account", "ids"] 
          } 
         } 
         } 
        } 
        } 
    } 
    

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

Затем мы можем использовать array_diff() или аналогичную функцию на других языках, кроме PHP, чтобы разграничить родительские идентификаторы сверху и исходный запрос. Затем это должно предоставить нам список учетных записей, в которых не было сопоставлено ни одно электронное письмо. Просто отправьте другой запрос, чтобы получить первичные электронные письма для этих учетных записей.

Для групп, отправить запрос типа account и:

  • Ограничить _id в список учетных записей идентификаторов.
  • Ограничение group.starred до true.

Это должно дать вам список избранных групп. Чтобы получить более подробную информацию (имя и т.д.), отправить запрос типа group и:

  • Constrain _id к группе Идентификаторы выше.

Наконец, сделайте обработку на стороне клиента, чтобы собрать ее, чтобы ее можно было использовать для следующей части вашей программы.

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