繁体   English   中英

Solr.Net查询返回错误结果

[英]Solr.Net query returning false results

我正在尝试使用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不鼓励创建Text查询,但我应该怎么做呢?

我使用SolrNet.dll版本0.4.0.2002和Solr Instance 4.4.0版本。

我找到了问题。 我得到错误结果的原因是因为我的查询选项中指定了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行。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM