我正在尝试使用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
版本。
答案 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