# Не работает boost в запросах

**URL:** <https://discuss.elastic.co/t/boost/51648>\
**Category:** Вопросы на русском языке\
**Created:** [June 2, 2016, 6:57am UTC](https://discuss.elastic.co/t/boost/51648 "2016-06-02T06:57:01Z")\
**Posts on this page:** 9\
**Page:** 1

<div class="post-metadata">

**Author:** ![MaWr](https://avatars.discourse-cdn.com/v4/letter/m/bbce88/32.png) [@MaWr](https://discuss.elastic.co/u/MaWr)\
**Post date:** [June 2, 2016, 6:57am UTC](https://discuss.elastic.co/t/boost/51648/1 "2016-06-02T06:57:01Z")

</div>

Добрый день!

Есть индекс:

```bash
curl -XDELETE "http://127.0.0.1:9200/tests"

curl -XPUT "http://127.0.0.1:9200/tests/" -d '{
   "settings":{
      "analysis":{
         "filter":{
            "edge":{"type":"edgeNGram", "min_gram":1, "max_gram":15},
            "substring":{"type":"nGram","min_gram":1,"max_gram":15},
            "synonym" : {"type" : "synonym", "synonyms":["alfa,beta","gamma,delta"]}
         },
         "analyzer":{
            "str_edge_index_analyzer":{"filter":["lowercase","edge"],"tokenizer":"keyword"},
            "edge_synonym_index":{"filter":["lowercase","synonym","edge"],"tokenizer":"keyword"},
            "str_index_analyzer":{"filter":["lowercase","substring"],"tokenizer":"keyword"},
            "synonym_index":{"filter":["lowercase","synonym","substring"],"tokenizer":"keyword"},
            "str_search_analyzer":{"filter":["lowercase"],"tokenizer":"standard"}
         }
      }
   },
   "mappings":{
      "test":{
         "properties":{
           "id" : {"type": "string"},
           "name":{
               "type":"multi_field",
               "fields":{
                  "edge":{"type":"string", "analyzer":"str_edge_index_analyzer", "search_analyzer":"str_search_analyzer"},
                  "syn_edge":{"type":"string","analyzer":"edge_synonym_index","search_analyzer":"str_search_analyzer"},
				  "ngram":{"type":"string","analyzer":"str_index_analyzer","search_analyzer":"str_search_analyzer"},
                  "syn":{"type":"string","analyzer":"synonym_index","search_analyzer":"str_search_analyzer"}
               }
            }
         }
      }
   }
}'

```

И данные в нем:

```bash
curl -XPOST "http://127.0.0.1:9200/tests/test/1" -d '{
	"id": "1",
	"name": "alfa"
}'

curl -XPOST "http://127.0.0.1:9200/tests/test/2" -d '{
	"id": "1",
	"name": "device beta"
}'

```

Делаю запрос по слову "beta":

```bash
curl -XPOST "http://127.0.0.1:9200/tests/test/_search?pretty=true" -d '{
   "query": {
      "multi_match": {
          "query": "beta",
          "fields": ["name.edge^100", "name.syn_edge^100", "name.ngram", "name.syn"],
          "analyzer": "str_search_analyzer", "fuzziness": "0"
          
      }
   },
   "explain":true,
   "size":4
}'

```

получаю такой ответ:

```json
{
  "took": 7,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 2,
    "max_score": 0.30685282,
    "hits": [
      {
        "_shard": 2,
        "_node": "fHFYjxEAQ6Oq6nc-Qf1y0Q",
        "_index": "tests",
        "_type": "test",
        "_id": "2",
        "_score": 0.30685282,
        "_source": {
          "id": "1",
          "name": "device beta"
        },
        "_explanation": {
          "value": 0.30685282,
          "description": "sum of:",
          "details": [
            {
              "value": 0.30685282,
              "description": "max of:",
              "details": [
                {
                  "value": 0.30685282,
                  "description": "weight(name.syn:beta in 0) [PerFieldSimilarity], result of:",

... skip ...

      },
      {
        "_shard": 3,
        "_node": "fHFYjxEAQ6Oq6nc-Qf1y0Q",
        "_index": "tests",
        "_type": "test",
        "_id": "1",
        "_score": 0.30685282,
        "_source": {
          "id": "1",
          "name": "alfa"
        },
        "_explanation": {
          "value": 0.30685282,
          "description": "sum of:",
          "details": [
            {
              "value": 0.30685282,
              "description": "max of:",
              "details": [
                {
                  "value": 0.0030685281,
                  "description": "weight(name.syn:beta in 0) [PerFieldSimilarity], result of:",
                  "details": [
                    {

... skip ...

                {
                  "value": 0.30685282,
                  "description": "weight(name.syn_edge:beta^100.0 in 0) [PerFieldSimilarity], result of:",

... skip ...

    ]
  }
}

```

Почему-то boost ^100 на поле name.syn\_edge работает не так как я ожидаю.  
Попробовал преобразовать запрос так:

```bash
curl -XPOST "http://127.0.0.1:9200/tests/test/_search?pretty=true" -d '{
   "query": {
      "bool": {
         "should": [
            { "match": { "name.edge": { "query":"beta", "boost":100, "analyzer":"str_search_analyzer", "fuzziness":"0" } } },
            { "match": { "name.syn_edge": { "query":"beta", "boost":100, "analyzer":"str_search_analyzer", "fuzziness":"0" } } },
            { "match": { "name.ngram": { "query":"beta", "analyzer":"str_search_analyzer", "fuzziness":"0" } } },
            { "match": { "name.syn": { "query":"beta", "analyzer":"str_search_analyzer", "fuzziness":"0" } } }
         ]
      }
   },
   "explain":true,
   "size":4
}'

```

Результат аналогичный.  
Что я делаю не так, почему boost учитывается как-то странно (на мой взгляд)?

---

<div class="post-metadata">

**Author:** ![Igor\_Motov](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/igor_motov/32/45193_2.png) [@Igor\_Motov](https://discuss.elastic.co/u/Igor_Motov)\
**Post date:** [June 2, 2016, 1:59pm UTC](https://discuss.elastic.co/t/boost/51648/2 "2016-06-02T13:59:33Z")

</div>

Boost нормализуется, поэтому вместо того, чтобы умножать оценку поля `name.edge` на 100, elasticsearch оставляет его без изменений и умножает оценки всех остальных полей без буста на 0.01.

Если интересуют детали, попробуйте сравнить оценку в одном и том же запросе по двум полям - с бустом и без и обратите внимание на то, как рассчитывается `queryWeight`. Вы увидите, что оценка полей с бустом действительно умножаются на 100, но при этом оценка всех полей еще и умножается на 0.01 (или что-то в этом роде в зависимости от запроса):

```auto
{
    "value": 0.01,
    "description": "queryNorm",
    "details": []
}

```

Еще почитайте тут - [https://www.elastic.co/guide/en/elasticsearch/guide/master/practical-scoring-function.html#query-norm](https://www.elastic.co/guide/en/elasticsearch/guide/master/practical-scoring-function.html#query-norm)

---

<div class="post-metadata">

**Author:** ![MaWr](https://avatars.discourse-cdn.com/v4/letter/m/bbce88/32.png) [@MaWr](https://discuss.elastic.co/u/MaWr)\
**Post date:** [June 2, 2016, 6:11pm UTC](https://discuss.elastic.co/t/boost/51648/3 "2016-06-02T18:11:43Z")

</div>

В том то и дело.  
в документе с name="device beta", который был найден по полям name.syn и name.ngram, которые в запросах не бустятся

```json
{
   "value": 1,
   "description": "fieldNorm(doc=0)",
   "details": []
}

```

И

```json
 {
   "value": 3.2588913,
   "description": "queryNorm",
   "details": []
}

```

А у документа "name": "alfa", который найден по полям name.syn\_edge с boost 100 и name.syn без boost ситуация такая:  
для поля name.syn\_edge:

```json
{
   "value": 1,
   "description": "fieldNorm(doc=0)",
   "details": []
}

```

для поля name.syn:

```json
{
   "value": 0.032588914,
   "description": "queryNorm",
   "details": []
}
{
   "value": 1,
   "description": "fieldNorm(doc=0)",
   "details": []
}

```

То есть как будто boost действует на уровне документа, а не на глобальном уровне поиска

У меня же задача ранжировать по такому принципу:  
скор документов найденных по полю "А" увеличим в 100 раз, скор документов найденных по полю "Б" оставим без изменения

---

<div class="post-metadata">

**Author:** ![Igor\_Motov](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/igor_motov/32/45193_2.png) [@Igor\_Motov](https://discuss.elastic.co/u/Igor_Motov)\
**Post date:** [June 2, 2016, 10:02pm UTC](https://discuss.elastic.co/t/boost/51648/4 "2016-06-02T22:02:51Z")

</div>

Похоже на баг. Без `fuzziness` или с одной шардой все работает как надо. Я открыл [https://github.com/elastic/elasticsearch/issues/18710](https://github.com/elastic/elasticsearch/issues/18710)

---

<div class="post-metadata">

**Author:** ![MaWr](https://avatars.discourse-cdn.com/v4/letter/m/bbce88/32.png) [@MaWr](https://discuss.elastic.co/u/MaWr)\
**Post date:** [June 3, 2016, 6:50am UTC](https://discuss.elastic.co/t/boost/51648/5 "2016-06-03T06:50:50Z")

</div>

Игорь, спасибо!

Буду следить за issue

---

<div class="post-metadata">

**Author:** ![MaWr](https://avatars.discourse-cdn.com/v4/letter/m/bbce88/32.png) [@MaWr](https://discuss.elastic.co/u/MaWr)\
**Post date:** [August 19, 2016, 7:14am UTC](https://discuss.elastic.co/t/boost/51648/6 "2016-08-19T07:14:34Z")

</div>

Игорь, добрый день!

Баг в lucene закрыт 21.06

Не подскажете, когда ожидать закрытия бага [https://github.com/elastic/elasticsearch/issues/18710](https://github.com/elastic/elasticsearch/issues/18710) и в какую версию войдет исправление?

Спасибо!

---

<div class="post-metadata">

**Author:** ![Igor\_Motov](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/igor_motov/32/45193_2.png) [@Igor\_Motov](https://discuss.elastic.co/u/Igor_Motov)\
**Post date:** [August 19, 2016, 2:59pm UTC](https://discuss.elastic.co/t/boost/51648/7 "2016-08-19T14:59:27Z")

</div>

> в какую версию войдет исправление?

Скорее всего в 5.0

---

<div class="post-metadata">

**Author:** ![MaWr](https://avatars.discourse-cdn.com/v4/letter/m/bbce88/32.png) [@MaWr](https://discuss.elastic.co/u/MaWr)\
**Post date:** [August 20, 2016, 7:49am UTC](https://discuss.elastic.co/t/boost/51648/8 "2016-08-20T07:49:30Z")

</div>

> [@Igor\_Motov](#):
>
> Скорее всего в 5.0

Спасибо!

---

<div class="post-metadata">

**Author:** ![system](https://us1.discourse-cdn.com/elastic/original/3X/1/a/1ac57faf039f6b580b3f104ef42a2a89e41014de.png) [@system](https://discuss.elastic.co/u/system)\
**Post date:** [July 6, 2017, 1:46pm UTC](https://discuss.elastic.co/t/boost/51648/9 "2017-07-06T13:46:18Z")

</div>


