#elasticsearch
#эластичный поиск
Вопрос:
ElasticSearch 1.2.1
Я пытаюсь запрашивать документы, используя взвешенные теги.
curl -X PUT 'http://localhost:9200/test'
curl -X PUT 'http://localhost:9200/test/thing/_mapping' - '{
"thing": {
"properties": {
"tags": {
"type": "nested",
"properties": {
"name": { "type": "string" },
"weight": { "type": "integer" }
}
}
}
}}'
Добавление документа:
curl -X PUT 'http://localhost:9200/test/thing/1', -d '{
"tags": [
{ "name": "a", "weight": 2 }
]
}'
Теперь я ищу документы, имеющие тег a
, и повышаю оценку на основе weight
.
Примечание: чтобы запустить эти примеры, вы должны включить динамические сценарии в ElasticSearch: добавить script.disable_dynamic: false
в elasticsearch.yml
curl -X GET 'http://localhost:9200/test/thing/_search?pretty' -d '{
"query": {
"function_score": {
"boost_mode": "replace",
"query": {
"match_all": {}
},
"functions": [
{
"filter": {
"nested": {
"path": "tags",
"filter": {
"term": {
"tags.name": "a"
}
}
}
},
"script_score": {
"script": "doc.weight.value"
}
}
]
}
}
}'
Документ найден, как и ожидалось, каким бы ни был результат 0
. Кажется, что собственность doc.weight
была пуста.
Давайте проверим это, заменив скрипт на doc.weight.empty ? 50 : 100
. Попадание теперь имеет оценку 50
, указывающую на то, что поле doc.weight
пусто. Однако он найден, потому что использование несуществующего имени поля (например doc.foobar
,) выдает ошибку.
Справочная информация: match_all
часть будет заменена реальным запросом. Я хочу использовать теги, чтобы увеличить результаты, соответствующие тегам, до тех, которые не соответствуют тегам.
Что я упускаю из виду?
Комментарии:
1. Вы уверены
doc.weight
, что это допустимый синтаксис для доступа к значениям полей? Я знаю толькоdoc['weight'].value
синтаксис, указанный в документах .2. Я полагаю, вам следует попробовать doc[‘теги. вес’].значение
3. @Thorsten две нотации эквивалентны, потому что документ оценивается как Карта. Я пробовал либо.