Solr.Net查询返回错误结果

时间:2014-02-10 21:23:00

标签: c# solr solrnet

我正在尝试使用Solr.Net搜索Solr实例。我有字段body,它在模式中定义为:

<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 Instance 4.4.0版本。

2 个答案:

答案 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)将强制首先根据相关性分数返回结果,然后根据ID进行排序。

我不确定为什么在向SOLR发送文本查询时会覆盖SortOrder。但这似乎有效,因为它将选择具有确切术语而不是误报的前100行。

我将为未来的访问者留下这个答案,并且如果它提供了此搜索行为的原因,将接受任何未来的答案。

答案 1 :(得分:1)

看起来这两个查询是不同的,因为第一个示例中的术语是标记化,而不是第二个,这是受双引号保护的。你介意试试:

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

这可能会给你与第二个查询相同的结果(如果不考虑排序)。 HIH