2

我对 Lucene 搜索查询进行了一些研究,并在互联网上搜索了有关如何执行此操作的答案......但是找不到有效的方法,我的尝试失败了,没有返回我想要的。

基本上,我的数据库中有一个字段,它是用逗号连接的 ID,这些字段是 Umbraco 文档属性。

例如,假设我有这些字段的条目:

条目1:相关内容: 500,700

条目2:相关内容: 500

我的搜索查询是针对值为 500 的字段,截至目前,它只返回条目 2,但是当我通过使用值 500* 使用通配符术语时,它会同时返回它们。那很好,但问题是在搜索不乞求价值的东西时。

当我搜索 700 时,它不会返回条目 1,并且在 Lucene 上的通配符搜索不允许 * 出现在搜索词的开头。

看起来我的查询正在搜索必须与搜索词完全相同的值。我认为,如果有一种方法可以进行查询,就像使用 .Contains() 搜索字符串中的子字符串一样,它会解决这个问题。

4

2 回答 2

3

Lucene 设计支持前导通配符(参考

如果您的网站不太复杂并且您可以确定性能不是问题,您可以enableLeadingWildcards="true"通过创建自己的自定义搜索器而不是使用 Umbraco 检查中的默认搜索器来启用前导通配符:

在设置中定义自定义搜索器:

<add name="CustomSearchSearcher" 
       type="MyNamespace.MyUmbracoExamineSearcher, MyNamespace"
       analyzer="Lucene.Net.Analysis.WhitespaceAnalyzer, Lucene.Net"
       enableLeadingWildcards="true"/>

想要搜索时使用 RawQuery:

var searchProvider = ExamineManager.Instance.SearchProviderCollection["CustomSearchSearcher"];
var searchCriteria = searchProvider.CreateSearchCriteria();
searchProvider.Search(searchCriteria.RawQuery("relatedContents:*700*));
于 2017-07-28T05:52:01.673 回答
0

我认为标记的答案不会解决您的问题。您应该调查您正在使用的分析仪。

如果您使用 KeywordAnalyzer,则字符串按原样使用逗号进行索引,并且您必须使用 *,但如果您使用标准分析器,则字符串会根据您的字段以不同的术语进行拆分,因此 500 或 700 应该找到您的节点。

如果您的索引需要 KeywordAnalyser,您可以做的是专门为该字段指定不同的分析器。为此,您必须直接使用 Lucene,而不是检查,并使用PerFieldAnalyserWrapper

于 2017-07-30T22:56:25.230 回答