正在搜索包含搜索字词

时间:2017-07-28 03:38:11

标签: c# umbraco lucene.net examine

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

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

例如,让我们说这些字段包含以下字段:

条目1: relatedContents: 500,700

条目2: relatedContents: 500

我的搜索查询适用于值为500的字段,截至目前,它只返回条目2,但是当我使用值500 *时使用通配符时,它会返回它们。这没关系,但问题是在搜索没有乞求价值的东西时。

当我搜索700时,它不会返回条目1并且Lucene上的WildCard搜索不允许*处于搜索词的乞讨位置。

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

2 个答案:

答案 0 :(得分:2)

Lucene设计支持 NOT 的前导通配符(Reference

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

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

<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*));

答案 1 :(得分:0)

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

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

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