Elasticsearch: получение оценок по каждому полю в одном документе

#elasticsearch

Вопрос:

Предполагая, что у меня есть документ с тремя полями: name , company , email каждое из которых сопоставлено с edge-ngram

 {
  "name": "John",
  "company": "John's company",
  "email": "johndoe@gmail.com" 
}
 

При поиске «джона» я хочу иметь возможность получить оценку каждого поля по отдельности

 {
  "query": {
    "bool": {
      "should": [
        { "match": { "name": "john" }},
        { "match": { "company": "john" }},
        { "match": { "email": "john" }}
      ]
    }
  }
}
 

В этом примере оценка по каждому match предложению складывается вместе, а затем делится на количество match предложений. Так есть ли в любом случае возможность получить оценку по каждому match пункту в отдельности, а не только итоговую оценку для всего документа?

Я думаю, что настройка «объяснить»: true также не идеальна, поскольку она предоставляет очень низкоуровневые сведения о подсчете очков (неэффективно и трудно анализировать).

Ответ №1:

Я не могу придумать, как вы могли бы сделать это, не изменяя результаты поиска.

Однако, если бы вы использовали разные повышения для каждого поля, вы могли бы изменить свой подход к определению значения каждого из них. Например, увеличение одного поля на 1, следующего на 10 и последнего на 100, а также изучение конечного числа может дать вам то, что вы ищете, однако поле, увеличенное на 100, будет единственным, что имеет значение.

Любопытно применение этого, так как кажется, что повышение в целом может решить то, что вы ищете.

Комментарии:

1.Я не думаю, что повышение поможет так сильно (поправьте меня, если я ошибаюсь). что я хочу сделать, так это реализовать автозаполнение, в котором я всегда показываю только два поля: первое- name поле, а второе-наивысший балл по полю между всеми остальными полями. например, если пользователь искал «джон», я всегда буду показывать name поле и выбирать наивысший балл поля между email company phone website полями, в зависимости от того, какой из них имеет наивысший балл, будет отображаться вместе с name полем.

2. Мысль состояла в том, чтобы использовать boost в качестве битовой карты, если хотите, чтобы диапазон оценок для каждого поля был перенесен в другой диапазон чисел. например, если a = 1 b=2 c=3, и я хочу сжать это в одно значение, я мог бы использовать x = a*10000 b*100 c, где результат равен 1002003, который я мог бы затем изменить и изменить, используя мои коэффициенты, коэффициенты будут вашими значениями повышения. Я не уверен, что нормализация происходит под счетом, так что это может быть просто невозможно.

3. Это была просто пришедшая мне в голову мысль, которая могла бы быть возможной, поэтому я поделился, определенно неизвестным решением