2015-12-29 1 views
0

Я хотел бы манипулировать счетом, который я получаю, когда выполняю поиск по elasticsearch. Я уже использую опцию boost, но это не дает мне результатов, которые я хотел бы иметь. После некоторого чтения я считаю, что запрос function_score является решением моей проблемы. Я понимаю, как это работает, но я не могу понять, как я могу изменить свой текущий запрос, чтобы использовать его с запросом function_score.Манипулировать счетом в elasticsearch

"query": { 
"filtered": { 
    "query": { 
     "bool": { 
      "should": [{ 
       "multi_match": { 
        "type": "most_fields", 
        "query": "paus", 
        "operator": "and", 
        "boost": 2, 
        "fields": [ 
         "fullname^2", 
         "fullname.folded", 
         "alias^2", 
         "name^2" 
        ], 
        "fuzziness": 0 
       } 
      }, { 
       "multi_match": { 
        "type": "most_fields", 
        "query": "paus", 
        "operator": "and", 
        "boost": 1.9, 
        "fields": [ 
         "taggings.tag.name^1.9", 
         "function", 
         "relations.master.name^1.9", 
         "relations.master.first_name^1.9", 
         "relations.master.last_name^1.9", 
         "relations.slave.name^1.9", 
         "relations.slave.first_name^1.9", 
         "relations.slave.last_name^1.9" 
        ], 
        "fuzziness": 0 
       } 
      }, { 
       "multi_match": { 
        "type": "most_fields", 
        "query": "paus", 
        "operator": "and", 
        "fields": [ 
         "fullname", 
         "alias", 
         "name" 
        ], 
        "boost": 0.2, 
        "fuzziness": 1 
       } 
      }, { 
       "match": { 
        "extra": { 
         "query": "paus", 
         "fuzziness": 0, 
         "boost": 0.1 
        } 
       } 
      }] 
     } 
    }, 
    "filter": { 
     "bool": { 
      "must": [ 
       { 
        "terms": { 
         "type": ["Person"] 
        } 
       }, 
       { 
        "term": { 
         "deleted": false 
        } 
       } 
      ] 
     } 
    } 
} 

Как вы можете видеть, у нас есть четыре вида матчей.

  • подталкивания 2: когда есть точные совпадения по имени
  • подталкивания 1,9: когда есть точные совпадения на оснащениях
  • подталкивания 0,2: при наличии совпадения по имени, но с одним характером письменного неправильно
  • подталкивания 0,1: когда результаты в дополнительном (описание) поле

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

Любая помощь будет оценена :)

ответ

1

Там нет четкого ответа на этот вопрос. Ваш лучший друг - Explain API. Он расскажет вам, как рассчитываются каждый номер документа score.

Самое важное, что нужно помнить, это boost - это просто один из факторов, учитываемых при расчете балла. От Docs

Практически нет простой формулы для определения «правильного» значения повышения для конкретного предложения запроса. Это вопрос «попробуй-и-посмотри». Помните, что повышение составляет всего лишь факторов, связанных с оценкой релевантности; он должен конкурировать с другими факторами

Это поможет вам много, если вы идете через Theory и Lucene's Practical Scoring Function. Это формула, используемая Lucene.

score(q,d) = 
      queryNorm(q) 
      · coord(q,d)  
      · ∑ (   
       tf(t in d) 
       · idf(t)²  
       · t.getBoost() 
       · norm(t,d)  
      ) (t in q) 

Теперь одна из нескольких причин вы не получаете ожидаемые результаты могут быть norm(t,d) и idf(t)². Например, если у вас есть extra поле paus me, а в других полях есть что-то вроде Меня зовут какой-то paus что-то, что дало бы field length norm i.e norm(t.d) более высокое значение. Кроме того, если у вас есть сказать, 10000 документов и только один документ имеет Paus в extra поле, что бы Inverse Frequency документа довольно высока, поскольку он рассчитывается как idf(t) = 1 + log (numDocs/(docFreq + 1)) здесь numDocs=10000 и docFreq=1 и это значение будет в квадрате. У меня была именно эта проблема в моем наборе данных.

Оценка нечеткого запроса может быть связана с this issue который в основном Lucene Issue. Это исправлено в последней версии.

Один из способов, который мог бы работать, - дать constant_score для прочтения двух статей и сказать повышение к первым двум статьям. This поможет в понимании.

Постарайтесь решить эту проблему шаг за шагом, начните с двух статей и посмотрите вывод explain api, затем попробуйте с тремя и, наконец, с четырьмя. Также удалите field boosting и попробуйте только с query boost. Постепенно вы выясните.

Я надеюсь, что это поможет!