Оценка скрипта ElasticSearch с использованием значения поля

#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 две нотации эквивалентны, потому что документ оценивается как Карта. Я пробовал либо.