Рассматривать дочернее поле как поле родителя в эластичном поисковом запросе

Я читаю документы для elasticsearch, и эта [страница] [1] рассказывает о сопоставлении дочернего элемента с родительским типом с помощью _parent.

Если у меня есть дети по имени email, привязанные к родителям по имениaccount:

Поля каждого типа:

account (http://localhost:9200/myapp/account/1)
========
id
name
some_other_info
state

email (http://localhost:9200/myapp/email/1?parent=1)
========
id
email
  • Как я могу искать в поле nameв accountи в поле emailв emailпри условии, что stateв accountравно active?

  • Есть ли способ получить всех дочерних элементов (определенного типа или любого типа ), которыми владеет родитель?

  • При индексировании дочернего документа можно ли передать родительский объект как свойство объекта в данных JSON, а не как часть строки запроса?


Попробовав предложение Имотова, я придумал этот запрос:

Это выполняется наhttp://localhost:9200/myapp/account/_search

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

Проблема в том, что вышеуказанное не дает мне никаких учетных записей, где электронная почта совпадает.

Эффект, которого я хочу, по сути:

  • Есть одно окно поиска
  • Пользователи начинают вводить текст, и поле поиска заполняется автоматически.
  • Запрос пользователя проверяется на соответствие имени типа accountили любому типу emailaddress.
  • Если accountsсовпали, просто верните их. Если emailaddressсоответствует, вернуть его родительскую учетную запись.
  • Ограничьте максимум до x (, скажем, 10 )аккаунтов для каждого поиска.

Итак, мне в основном нужно иметь возможность ORискать между двумя типами и возвращать родительский тип совпадений.


Данные испытаний:

curl -XPUT http://localhost:9200/test/account/1 -d '{
    "name": "John Smith",
    "statuses": "active"
}'

curl -XPUT http://localhost:9200/test/account/2 -d '{
    "name": "Peter Smith",
    "statuses": "active"
}'

curl -XPUT http://localhost:9200/test/account/3 -d '{
    "name": "Andy Smith",
    "statuses": "active"
}'

//Set up mapping for parent/child relationship

curl -XPUT 'http://localhost:9200/test/email/_mapping' -d '{
    "emails" : {
        "_parent" : {"type" : "account"}
    }
}'

curl -XPUT http://localhost:9200/test/email/1?parent=1 -d '{
    "email": "john@smith.com"
}'

curl -XPUT http://localhost:9200/test/email/2?parent=1 -d '{
    "email": "admin@mycompany.com"
}'

curl -XPUT http://localhost:9200/test/email/3?parent=1 -d '{
    "email": "abcd@efg.com"
}'

curl -XPUT http://localhost:9200/test/email/4?parent=2 -d '{
    "email": "peter@peter.com"
}'

curl -XPUT http://localhost:9200/test/email/5?parent=3 -d '{
    "email": "andy@yahoo.com"
}'

curl -XPUT http://localhost:9200/test/email/6?parent=3 -d '{
    "email": "support@mycompany.com"
}'

решение Имотова сработало для меня. Другое решение, которое я нашел, состоит в том, чтобы запросить accounts для status = active, затем запустить фильтр boolдля результата и использовать has_childдля дочернего типа и prefixдля nameвнутри фильтра bool..

20
задан deizel 10 November 2012 в 11:31
поделиться