2015-08-17 2 views
8

Я знаю, что elasticsearch учитывает длину поля при вычислении оценки документов, полученных запросом. Чем короче поле, тем выше вес (см. The field-length norm).Как я могу увеличить норму длины поля в счете функции elasticsearch?

Мне нравится это поведение: когда я ищу iphone Меня больше интересует iphone 6, чем в Crappy accessories for: iphone 5 iphone 5s iphone 6.

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

Я знаю, что можно изменить оценку, используя function score, и я думаю, что я смогу достичь того, что хочу, через script score.

Я попытался добавить еще одно поле длины норму в счет, как это:

{ 
    "query": { 
     "function_score": { 
     "boost_mode": "replace", 
     "query": {...}, 
     "script_score": { 
      "script": "_score + norm(doc)" 
     } 
     } 
    } 
    } 

Но мне не удалось плохо, получаю эту ошибку: [No parser for element [function_score]]

EDIT:

Моя первая ошибка была что я не завернул счет функции в «запросе». Теперь я редактировал код выше. Моя новая ошибка говорит

GroovyScriptExecutionException[MissingMethodException 
[No signature of method: Script5.norm() is applicable for argument types: 
(org.elasticsearch.search.lookup.DocLookup) values: 
[<[email protected]>] 
Possible solutions: notify(), wait(), run(), run(), dump(), any()]] 

EDIT: Я предоставил первый ответ, но я надеюсь на лучшее один

ответ

8

Похоже, вы могли бы достичь этого, используя поле type token_count вместе с field_value_factor function score.

Так, что-то вроде этого в отображении поля:

"name": { 
    "type": "string", 
    "fields": { 
    "length": { 
     "type":  "token_count", 
     "analyzer": "standard" 
    } 
    } 
} 

Это будет использовать количество жетонов в поле. Если вы хотите использовать количество символов, вы можете изменить анализатор с standard на пользовательский, который символизирует каждый символ.

Тогда в запросе:

"function_score": { 
    ..., 
    "field_value_factor": { 
    "field": "name.length", 
    "modifier": "reciprocal" 
    } 
} 
3

У меня есть что-то, что вид работ. Со следующим, я вычитаю длину поля моих интересов из оценки.

{ 
"query": { 
    "function_score": { 
    "boost_mode": "replace", 
    "query": {...}, 
    "script_score": { 
     "script": "_score - doc['<field_name>'].value.length()" 
    } 
    } 
} 
} 

Hovever, я не могу контролировать относительный вес этого числа. Я вычитаю по сравнению со старым счетом. Вот почему я не принимаю свой ответ: я подожду лучше. В идеале, мне бы хотелось иметь доступ к функции field length norm в пределах script_score или получить эквивалентный результат.

Смежные вопросы