Как связать значение с ключевым словом в Elasticsearch - PullRequest
0 голосов
/ 06 апреля 2020

Я использую Elasticsearch 7.6 и индексирую список ключевых слов со следующим определением сопоставления:

"keywords" : {
  "type" : "text",
  "analyzer": "std_folded",
  "store": true,
  "fields": {
    "keyword": {
      "type": "keyword"
    }
  }
},

Как видите, имя поля равно keywords, которому будет присвоен список слова. Кроме того, я определил keywords.keyword как тип keyword.

Можно ли присвоить какое-то значение (оценку) каждому слову? Я надеюсь получить значение в моем запросе скрипта позже.

1 Ответ

1 голос
/ 06 апреля 2020

Фон

Так что, если бы не каждое слово, а назначить конкретное значение c (оценка, как в вашем случае) для каждого поля, вы могли бы использовать что-то похожее на index- time boost , который устарел с 5.0.

Если я понял, вы можете иметь несколько значений для вашего поля keywords, например foo, bar и baz, принадлежащих одному и тому же документу. и вы хотите, чтобы все различные оценки, такие как foo:1, bar:2 и baz:3, , представляли собой значение оценки или усиления на поле, а не на поле.

Решение: используя вложенный тип данных , вы можете решить эту проблему.

Рабочий пример:

Определение индекса

{
  "mappings": {
    "properties": {
      "keywords": {
        "type": "nested" --> note this
      }
    }
  }
}

Пример индекса do c

{
  "keywords" : [
    {
      "keyword" : "foo",
      "score" :  1
    },
    {
      "keyword" : "bar",
      "score" :  2
    },
    {
        "keyword" : "baz",
        "score" : 3
    }
  ]
}

Поисковый запрос для получения документов, имеющих foo и балл 1

{
    "query": {
        "nested": {
            "path": "keywords",
            "query": {
                "bool": {
                    "must": [
                        {
                            "match": {
                                "keywords.keyword": "foo"
                            }
                        },
                        {
                            "match": {
                                "keywords.score": 1
                            }
                        }
                    ]
                }
            },
            "inner_hits": { --> notice this, it would bring inner doc `foo:1`

            }
        }
    }
}

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

 "hits": [
      {
        "_index": "nested",
        "_type": "_doc",
        "_id": "1",
        "_score": 1.9808291,
        "_source": {
          "keywords": [
            {
              "keyword": "foo",
              "score": 1
            },
            {
              "keyword": "bar",
              "score": 2
            },
            {
              "keyword": "baz",
              "score": 3
            }
          ]
        },
        "inner_hits": {
          "keywords": {
            "hits": {
              "total": {
                "value": 1,
                "relation": "eq"
              },
              "max_score": 1.9808291,
              "hits": [
                {
                  "_index": "nested",
                  "_type": "_doc",
                  "_id": "1",
                  "_nested": {
                    "field": "keywords",
                    "offset": 0
                  },
                  "_score": 1.9808291, --> your expected result in inner hits
                  "_source": {
                    "keyword": "foo",
                    "score": 1
                  }
                }
              ]
...