При условии, что вы использовали динамические сопоставления по умолчанию при индексации документов, все ваши strings
должны были отображаться как тип text
и тип keyword
.Следовательно, простой запрос term
в сопоставлении keyword
должен дать результаты, которые вы ищете.
Например, создание индекса с настройками по умолчанию выполняется просто следующим образом:
PUT countries-codes
Индексирование документа в том виде, в котором оно представлено, будет выглядеть следующим образом:
POST countries-codes/event
{
"name": "Albanie",
"alpha_2": "AL",
"alpha_3": "ALB",
"num": "8"
}
Теперь мы можем посмотреть на отображение нашего индекса, чтобы увидеть, как Elasticsearch отображал поля внутри:
GET countries-codes/_mapping
Результат:
{
"countries-codes" : {
"mappings" : {
"event" : {
"properties" : {
"alpha_2" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"alpha_3" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"name" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"num" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
}
}
}
}
}
}
Теперь мы просто выполним term
запрос к сопоставлению keyword
двухзначного кода страны, и мы получим обратно документ, представляющийсовпадение (или, если есть какие-то совпадения, все документы, представляющие эти совпадения):
GET countries-codes/_search
{
"query": {
"bool": {
"filter": {
"term": {
"alpha_2.keyword": "AL"
}
}
}
}
}
Обратите внимание, что это отфильтрованный запрос, так как вы не заинтересованы в оценке.Короче говоря, контекст фильтра будет быстрее, чем контекст запроса, поэтому используйте его при любой возможности.За дополнительной информацией обращайтесь: https://www.elastic.co/guide/en/elasticsearch/reference/current/query-filter-context.html
. Это приведет к тому, что документ, который вы опубликовали ранее, находится в массиве возврата hits
:
{
"took" : 1,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : 1,
"max_score" : 0.0,
"hits" : [
{
"_index" : "countries-codes",
"_type" : "event",
"_id" : "qGDmEWoBqkB-aMRpdfvt",
"_score" : 0.0,
"_source" : {
"name" : "Albanie",
"alpha_2" : "AL",
"alpha_3" : "ALB",
"num" : "8"
}
}
]
}
}
.пустой массив хитов.На стороне клиента вы можете разобрать только тот элемент, который вам нужен.Если у вас были очень большие документы или возвращалось большое количество документов, вам нужно просмотреть source filtering
- https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-source-filtering.html
Например:
GET countries-codes/_search
{
"_source": "alpha_3",
"query": {
"bool": {
"filter": {
"term": {
"alpha_2.keyword": "AL"
}
}
}
}
}
В возвращенных совпаденияхобъект, вы заметите, что только часть результата, которую вы хотели получить, возвращается из документа:
"hits" : {
"total" : 1,
"max_score" : 0.0,
"hits" : [
{
"_index" : "countries-codes",
"_type" : "event",
"_id" : "qGDmEWoBqkB-aMRpdfvt",
"_score" : 0.0,
"_source" : {
"alpha_3" : "ALB"
}
}
]
}
Все примеры показаны с использованием Dev Tools / простых вызовов API.Поскольку вы используете Python, посмотрите на официально поддерживаемые библиотеки Elasticsearch:
Elasticsearch DSL - построен на основе нижнего уровня Elasticsearch-Py - https://elasticsearch -dsl.readthedocs.io / en /последний /
Elasticsearch-Py - https://elasticsearch -py.readthedocs.io / en / master /