# Как настроить порядок вывода результатов запроса по релевантности?

**URL:** <https://discuss.elastic.co/t/topic/210036>\
**Category:** Вопросы на русском языке\
**Created:** [November 30, 2019, 6:06pm UTC](https://discuss.elastic.co/t/topic/210036 "2019-11-30T18:06:32Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![111249](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/111249/32/58382_2.png) [@111249](https://discuss.elastic.co/u/111249)\
**Post date:** [November 30, 2019, 6:06pm UTC](https://discuss.elastic.co/t/topic/210036/1 "2019-11-30T18:06:32Z")

</div>

Смысл вопроса в следующем: у меня есть множество товаров, которые содержат к примеру слово "помидор". Я хочу настроить выборку следующим образом: приоритет должен отдаваться сначала точным совпадениям, то есть, если пользователь пишет "помидор", то первыми ему должны выводиться "свежий помидор", "розовый помидор".. Затем должны выбираться нечеткие совпадения: "салат с помидорами", "Консервированные помидоры".. и после них совпадения по синонимам: "томаты в собственном соку". Я так понимаю, что если поиск по полю "title", то мне нужно в маппинге делать этому полю "fields" и добавлять туда анализаторы, а в самом запросе использовать "bool" -\> "should" и вписать туда все эти три варианта, каждый со своим "boost" параметром? Мой запрос выглядит так:

```auto
{
  "sort": [{"_score": {"order": "desc"}}],
  "min_score": 15,
  "query": {
    "function_score": {
      "query": {
        "bool" : {
          "must" : [],
          "filter": [{
            "term": {"supermarket": "TE"}
          }],
          "should" : [
            {
              "multi_match": {
                "query": "tomato",
                "type": "most_fields",
                "fields": ["title^2", "brand^1.5", "category^1.5"],
                "fuzziness": 4,
                "analyzer": "query_synonyms"
              }
            }
          ]
        }
      },
      "script_score" : {
        "script" : "_score + (doc['numberOfReviews'].value * 0.001) + (doc['numberOfRecipes'].value * 0.025) + (doc['numberOfShoppingLists'].value * 0.025) + (doc['numberOfStarterLists'].value * 0.025)"
      }
    }
  }
}

```

И еще про score. Не до конца понимаю, как он определяется, в результатах выборки, слова с неточным вхождением могут быть выше, чем с точным (в скрипте я убираю дополнительный подсчет по полям, оставляю только score) почему так получается?

---

<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:** [December 2, 2019, 2:43pm UTC](https://discuss.elastic.co/t/topic/210036/2 "2019-12-02T14:43:35Z")

</div>

> [@111249](#):
>
> каждый со своим "boost" параметром?

да

> [@111249](#):
>
> И еще про score. Не до конца понимаю, как он определяется,

Включите [`explain`](https://www.elastic.co/guide/en/elasticsearch/reference/current/search-search.html). Вам (очень) подробно расскажут как этот `_score` был рассчитан.

---

<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:** [December 30, 2019, 2:43pm UTC](https://discuss.elastic.co/t/topic/210036/3 "2019-12-30T14:43:46Z")

</div>

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.
