#python #amazon-web-services #elasticsearch
#python #amazon-веб-сервисы #elasticsearch
Вопрос:
Я хочу включить поиск только в одном поле «XYZ». Я использую следующий код, но он выдает ошибку. Не могли бы вы, пожалуйста, помочь мне с этим?
{
"dynamic": "false",
"properties": {
"ABC": {
"type": "text",
"index": false,
"store": true
},
"PQR": {
"type": "text",
"index": false,
"store": true
},
"XYZ": {
"type": "text"
}
}
}
PS Я хочу, чтобы поля «ABC» и «PQR» сохранялись в эластичном поиске, но я также хочу отключить поиск по этим полям.
Ответ №1:
Вы можете использовать параметр enabled mapping
Включенный параметр, который может применяться только к определению сопоставления верхнего уровня и полям объекта, приводит к тому, что Elasticsearch полностью пропускает синтаксический анализ содержимого поля. JSON все еще может быть извлечен из поля _source, но он недоступен для поиска или сохранен каким-либо другим способом:
Сопоставление индексов:
{
"mappings": {
"properties": {
"ABC": {
"enabled":false
},
"PQR": {
"enabled":false
},
"XYZ": {
"type": "text"
}
}
}
}
Индексировать данные:
{
"ABC": "b",
"PQR": "c",
"XYZ": "a"
}
Поисковый запрос:
При поиске по PQR
полю результатов поиска нет.
{
"query": {
"match": {
"PQR": {
"query": "c"
}
}
}
}
Результат поиска:
"hits": {
"total": {
"value": 0,
"relation": "eq"
},
"max_score": null,
"hits": []
}
Поисковый запрос:
{
"query": {
"match": {
"XYZ": {
"query": "a"
}
}
}
}
Результат поиска:
"hits": [
{
"_index": "stof_64113718",
"_type": "_doc",
"_id": "1",
"_score": 0.13353139,
"_source": {
"ABC": "b",
"PQR": "c",
"XYZ": "a"
}
}
]
Комментарии:
1. Я хочу, чтобы поля «ABC» и «PQR» сохранялись в эластичном поиске, но я также хочу отключить поиск по этим полям.
Ответ №2:
Похоже, вы получаете исключение ниже:
«причина»: «не удалось создать запрос: невозможно выполнить поиск по полю [PQR], поскольку оно не проиндексировано».,
И это правильно, так как для поиска он должен быть проиндексирован, что контролируется параметром index, который вы установили как false .
Ваша текущая настройка верна, и вам необходимо исключить поля из ваших поисковых запросов, которые не индексируются, и это очень распространенный шаблон, которому следует множество приложений, в противном случае вы можете следовать ответу Бхавьи, но там эти поля будут сохранены как часть _source
и убедитесь, что он не отключен (это очень распространенный шаблон).включено по умолчанию).
Ответ №3:
Я считаю, что вы неправильно используете синтаксис :
PUT indexName
{
"mappings": { // <=============== This is missing
"dynamic": false,
"properties": {
"ABC": {
"type": "text", //<============= If type is object, use 'enabled' instead of 'index'
"index": false,
"store": true
},
"PQR": {
"type": "text",
"index": false,
"store": true
},
"XYZ": {
"type": "text"
}
}
}
}
Примечание:
-
enabled = false обычно используется с полями типа object
-
index = false используется с предопределенными типами, такими как text и т. Д
-
Оба index=false amp; enabled=false сделают поле неиндексируемым, но поле все равно будет присутствовать в _source .
-
Для полей, где index=false, любые поисковые запросы по этим полям приведут к следующей ошибке :
Cannot search on-field [xyz] since it is not indexed
-
Для любых полей (type= object), где enabled = false, любые поисковые запросы по этим полям не приведут ни к какой ошибке.