我对Lucene搜索查询进行了一些研究,并在互联网上搜索了如何做到这一点的答案......但是找不到有效的方法,我的尝试失败了,没有返回我想要的内容。
基本上,我的数据库中有一个字段,它是由逗号连接的ID,这些字段是Umbraco文档属性。
例如,让我们说这些字段包含以下字段:
条目1: relatedContents: 500,700
条目2: relatedContents: 500
我的搜索查询适用于值为500的字段,截至目前,它只返回条目2,但是当我使用值500 *时使用通配符时,它会返回它们。这没关系,但问题是在搜索没有乞求价值的东西时。
当我搜索700时,它不会返回条目1并且Lucene上的WildCard搜索不允许*处于搜索词的乞讨位置。
看起来我的查询正在搜索必须与搜索字词完全相同的值。如果有一种方法可以进行查询,那么就像使用.Contains()来搜索字符串中的子字符串一样,我认为它会解决这个问题。
答案 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