2014-02-10 4 views
1

Я пытаюсь найти экземпляр Solr с Solr.Net. У меня есть поле body который определен в схеме как:Запрос Solr.Net, возвращающий ложные результаты

<field name="body" 
     type="text_general" 
     indexed="true" 
     stored="true" 
     omitNorms="true"/> 

text_general использует в схеме solr.StandardTokenizerFactory и определяется как:

<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100"> 
    <analyzer type="index"> 
    <tokenizer class="solr.StandardTokenizerFactory"/> 
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" /> 
    <!-- in this example, we will only use synonyms at query time 
    <filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/> 
    --> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 
    <analyzer type="query"> 
    <tokenizer class="solr.StandardTokenizerFactory"/> 
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" /> 
    <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 
</fieldType> 

(я не изменил ничего с этим типом поля, Это один Я получил стандартную установку solr)

Я пытаюсь запросить записи по поисковому запросу LISTBU5.RCV, он возвращает мне результаты, содержащие LISTBU4.RCV. Как:

Items left on queue: \\111.11.11.11\Lists\SAVELIST\ABC2\LISTBU4.RCV 

Ложные Результат: Номер в конце срока поиска отличается

Мой код для выполнения запросов является:

SolrQueryByField solrQuery = new SolrQueryByField("body", searchTerm); 

var result = solr.Query(solrQuery, new SolrNet.Commands.Parameters.QueryOptions 
{ 
    Rows = 100, // 
    Start = 0, 
    OrderBy = new[] { new SortOrder("ID", Order.DESC) }, 
}); 

Но если я использую текст запроса, например:

SolrQuery solrQuery = new SolrQuery("(body:" + "\"" + searchTerm + "\")"); 

Он возвращает точные результаты. Я знаю, что создание текстового запроса не рекомендуется в Solr.Net, но что мне с этим делать?

Я использую SolrNet.dll версия 0.4.0.2002 с экземпляром Solr 4.4.0 версия.

ответ

2

Я смог найти проблему. Причина, по которой я получал ложный результат, была из-за SortOrder, указанной в моих параметрах запроса. Это было отменено по умолчанию SortOrder на основе оценки релевантности. Я только изменил мои параметры запроса, как:

var result = solr.Query(solrQuery, new SolrNet.Commands.Parameters.QueryOptions 
{ 
    Rows = 100, // 
    Start = 0, 
    OrderBy = new[] { new SortOrder("score", Order.DESC), new SortOrder("ID", Order.DESC) }, 
}); 

new SortOrder("score", Order.DESC) заставит результаты должны быть возвращены на основе релевантности забьет первым, а затем он будет делать сортировку на основе идентификатора.

Я не совсем уверен, почему SortOrder был отменен при отправке текстового запроса в SOLR. Но это похоже на то, что он будет выбирать лучшие 100 строк с точным выражением вместо ложных срабатываний.

Я просто оставлю этот ответ для будущих посетителей и буду принимать любой будущий ответ, если он дает основания для этого поведения поиска.

1

Похоже, что два запроса были разными, поскольку термин был равен , но в то же время он был отмечен, но не вторым, который был защищен двойной цитатой. Вы не возражаете бы попробовать:

SolrQueryByField solrQuery = new SolrQueryByField("body", "\""+searchTerm+"\""); 

Это может дать вам тот же результат, что и 2-го запроса (если не считать упорядочивание). HIH

+0

Пробовал, что, не работает. Это возвращает тот же результат. – user2711965

+0

с простым текстовым запросом работает так, как ожидалось, я также указал это в моем вопросе. В пользовательском интерфейсе Solr Web, если я получу ожидаемый результат. Только «SolrQueryByField» не дал правильного результата. Я считаю, что нашел решение и разместил то же самое, что и ответ. – user2711965