Как сделать запрос с постоянным счетом в Solr

Я использую SolrNet для доступа к индексу Solr, где у меня есть многозначное поле, называемое «теги». Я хочу выполнить следующий запрос псевдокода:

(теги: стек) ^ 10 ИЛИ (теги: больше) ^ 5 ИЛИ (теги: поток) ^ 2

где термин «стек» увеличивается на 10, «сверх» увеличивается на 5, а «поток» увеличивается на 2. Результат, который я получил, заключается в том, что результаты с «стеком» будут выше, чем с « поток »и др.

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

Когда этот проект был реализован прямо в Lucene, я использовал ConstantScoreQuery, и они устранили idf, основанный исключительно на значении повышения.

Как этого можно достичь с помощью Solr и SolrNet, когда я эффективно просто передаю Solr строку запроса? Если нет, есть ли альтернативный способ решения этой проблемы?

Заранее спасибо!


person robinbetts    schedule 15.12.2010    source источник
comment
что, если вы уберете балл из своего последнего предложения? (tags:flow) Я считаю, что это запрос на постоянную оценку. Фактически, это повышение очков на 1, что является значением по умолчанию.   -  person Josh    schedule 15.12.2010


Ответы (2)


Я не думаю, что есть способ напрямую выразить ConstantScoreQuery в Solr, но кажется, что запросы диапазона и префикса используют ConstantScoreQuery под капотом, поэтому вы можете попробовать имитировать запрос диапазона, например tags:[flow TO flow]

В качестве альтернативы вы можете реализовать свой собственный Solr QueryParser.

person Mauricio Scheffer    schedule 15.12.2010
comment
Подделка запроса диапазона работает (по крайней мере, на данный момент). Если позволит время, я могу рассмотреть возможность реализации пользовательского парсера запросов. Спасибо. - person robinbetts; 17.12.2010

В Solr 5.1 и более поздних версиях это встроено в синтаксис парсера запросов с помощью оператора ^ =.

Так что просто возьмите исходный запрос: (теги: стек) ^ 10 ИЛИ (теги: больше) ^ 5 ИЛИ (теги: поток) ^ 2

И замените ^ на ^ =, чтобы переключиться с ускоренного на постоянный: (теги: стек) ^ = 10 ИЛИ (теги: больше) ^ = 5 ИЛИ (теги: поток) ^ = 2

person Yonik    schedule 20.06.2014
comment
добавление поддельного запроса диапазона повлияет на производительность .. Это должен быть принятый ответ .. Спасибо за решение @Yonik - person Vibhav Singh Rohilla; 22.11.2018