Эластичный поиск — множественный индекс с отображением полей

#python #elasticsearch

#python #эластичный поиск

Вопрос:

Мне нужно выполнить поиск по нескольким индексам вместе с его картами полей.

Например, я хочу запросить строку в

 field1 with index1

field2 with index2
  
 from elasticsearch import Elasticsearch
es = Elasticsearch([eshost])
req_string = {
  "size":1000,
  "query": {
    "query_string": {
      "query": "string to be searched",
      "fields": ["field1","field2"],
    }
  }
}

res = es.search(index='index1,index2', body=req_string)
  

Возможно ли это сделать?
Если да, пожалуйста, укажите несколько ссылок. Заранее спасибо!

Ответ №1:

Вы можете использовать поле _index при запросе по нескольким индексам.

Поле _index позволяет сопоставлять по индексу, в который был проиндексирован документ. Его значение доступно в определенных запросах и агрегациях, а также при сортировке или написании сценариев

Добавление рабочего примера с индексными данными, поисковым запросом и результатом поиска.

Индексировать данные:

 PUT/ index1/_doc/1
    {
        "name": "Hello"
    }

PUT/ index2/_doc/1
{
    "name": "Hello World"
}
  

Поисковый запрос:

 {
    "query": {
        "bool": {
            "filter": [
                {
                    "terms": {
                        "_index": [
                            "index1",
                            "index2"
                        ]
                    }
                }
            ],
            "must": [
                {
                    "simple_query_string": {
                        "query": "hello",
                        "fields": [
                            "name",
                            "title"
                        ]
                    }
                }
            ]
        }
    }
}
  

Результат поиска:

 "hits": [
  {
    "_index": "index2",
    "_type": "_doc",
    "_id": "1",
    "_score": 0.4700036,
    "_source": {
      "name": "Hello World"
    }
  },
  {
    "_index": "index1",
    "_type": "_doc",
    "_id": "1",
    "_score": 0.2876821,
    "_source": {
      "title": "Hello"
    }
  }
]
  

Обновленный поисковый запрос:

Приведенный ниже поисковый запрос будет искать title только поле в index1 и name только поле в index2

 {
    "query": {
        "bool": {
            "should": [
                {
                    "bool": {
                        "filter": [
                            {
                                "terms": {
                                    "_index": [
                                        "index1"
                                    ]
                                }
                            }
                        ],
                        "must": [
                            {
                                "query_string": {
                                    "query": "hello",
                                    "fields": [
                                        "title"
                                    ]
                                }
                            }
                        ]
                    }
                },
                {
                    "bool": {
                        "filter": [
                            {
                                "terms": {
                                    "_index": [
                                        "index2"
                                    ]
                                }
                            }
                        ],
                        "must": [
                            {
                                "query_string": {
                                    "query": "hello",
                                    "fields": [
                                        "name"
                                    ]
                                }
                            }
                        ]
                    }
                }
            ]
        }
    }
}
  

Комментарии:

1. На самом деле, если оба индекса имеют «name» и «title», будет ли он учитывать index1 с именем и index2 с заголовком??

2. @VivekAnanthan он не будет учитывать name from index2 и title from index1 . Приведенный выше поисковый запрос просто ищет соответствующий документ в заданных индексах. Но если вам нужен такой вариант использования, когда индекс должен быть сопоставлен с определенным полем, тогда вы можете просмотреть мой обновленный запрос (используя несколько предложений bool)

3. @VivekAnanthan у вас была возможность просмотреть мой ответ, с нетерпением жду обратной связи от вас 🙂