2015-06-02 3 views
1

Я использую elasticsearch в своем проекте. У меня есть два индекса: один содержит список идентификаторов использования, а другой содержит Employee_name, дату присоединения и идентификатор сотрудника. Можно ли использовать идентификатор сотрудника из одного индекса и находить информацию о сотрудниках из другого индекса?Индексирование индексирования

Index со списком сотрудников ID:

1 июня 2015, 12: 02: 15,209 сообщение: 8997745

1 июня 2015 года, 12: 02: 15,210 сообщение: 8997728

1 июня 2015, 12: 02: 15,211 сообщение: 8997719

Index со списком информации о сотрудниках:

1 июня 2015, 12: 02: 15,205 сообщение: Боб, 2015-05-31,899 7745

1 июня 2015, 12: 02: 15,206 сообщение: Джеймс, 2015-05-31,8997728

1 июня 2015, 12: 02: 15,207 сообщение: Том, 2015-05-31,8997719

Кроме того, я заметил, что каждая запись в индексе имеет уникальный идентификатор. Есть ли способ предоставить уникальный идентификатор для индекса, чтобы все записи из одного индекса имели одинаковый идентификатор индекса?

Спасибо за помощь заранее! 

+0

Вы можете разместить сопоставление обоих индексов? – manuel

+0

Вы должны использовать elasticsearch как плоскую таблицу, а не как классную SQL DB с внутренними соединениями. – manuel

ответ

0

elasticSearch - это совершенно NoSQL, не думайте о переносе схемы mysql на flexibleSearch (или MongoDB), это не сработает, вы должны подумать об этом, чтобы уважать философию NoSQL.

Если документ не имеет поля «_id», ES будет генерировать его.

1

В зависимости от ваших потребностей, вы можете сделать это в коде (чтение EMPLOYEE_ID из INDEX1 и сделать поиск идентификаторов фильтра (https://www.elastic.co/guide/en/elasticsearch/reference/1.7/query-dsl-ids-filter.html).

Это не может быть практичным для больших списков сотрудников. Если у вас есть на самом деле большой список в первом индексе, в котором есть идентификаторы сотрудников, может оказаться полезным выполнить запрос сканирования по второму индексу и проверить идентификаторы сотрудников, которые вы получаете от запроса к первому индексу (https://www.elastic.co/guide/en/elasticsearch/guide/current/scan-scroll.html?q=scan%20scroll). Конечно, вы теряете сортировка.

Более продвинутый вариант для действительно больших наборов данных может заключаться в использовании elasticsearch-hadoop и написании SQL-запроса Spark или что-то в этом роде. откладывается на прецедент. Почему существует первый индекс с идентификаторами только для сотрудников?

0

Каждый документ в индексе elasticsearch должен иметь уникальный идентификатор. Как сказал Томас выше, elassticsearch довольно NoSQL, не думайте о переносе схемы mysql на flexibleSearch. Но вам, Чтобы сделать что-то похожее на JOIN, вы должны иметь parent child relationship, определенный в вашем сопоставлении.Что-то, как внешние ключи, которые мы используем в SQL,

{ 
    "mappings": { 
    "department": { 

    }, 
    "employee": { 
     "_parent": { 
     "type": "department" 
     } 
    } 
    } 
} 

Затем вы можете найти индекс персонала и сопоставить его с отделом,

{ 
    "query": { 
    "has_parent": { 
     "type": "department", 
     "query": { 
     "match": { 
      "name": "something" 
     } 
     } 
    } 
    } 
} 
0

Вы можете использовать "Nested Type" в определении отображения для хранения вашего определенного идентификатора каждый сотрудник

0

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

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

Предлагаю использовать terms lookup, поддерживаемый в Elasticsearch. Вы можете считать операцию объединения двумя последовательными операциями: фильтром и комбинацией. Используйте terms lookup для фильтрации записей, которые вы хотите, и объедините данные самостоятельно в своем приложении. Поскольку поиск терминов поддерживается Elasticsearch изначально, и только несколько записей извлекаются из Elasticsearch, а затем объединены в ваше приложение, процесс будет очень быстрым. По моему опыту, несколько миллионов записей могут быть отфильтрованы менее 10 секунд.

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