搜索包含搜索词的字段
Searching for fields that contains the search term
我对 Lucene 搜索查询进行了一些研究,并在互联网上搜索了有关如何执行此操作的答案...但是找不到有效的方法,我的尝试失败了,而不是 return想要。
基本上,我的数据库中有一个字段,它是由逗号连接的 ID,这些字段是 Umbraco 文档属性。
例如,假设我有以下字段的条目:
条目 1:相关内容: 500,700
条目 2:相关内容: 500
我的搜索查询是针对值为 500 的字段,截至目前,它只有 return 条目 2,但是当我通过使用值 500* 使用通配符时,它 return 是他们两个。那很好,但问题是在搜索不乞求价值的东西时。
当我搜索 700 时,returnLucene 上的条目 1 和 WildCard 搜索不允许 * 位于搜索词的开头。
看来我的查询正在搜索必须与搜索词完全相同的值。如果有一种方法可以进行查询,打个比方,比如使用 .Contains() 来搜索字符串中的子字符串,我认为它会解决这个问题。
前导通配符 NOT Lucene 设计支持 (Reference)
如果您的网站不太复杂并且您可以确定性能不是问题,您可以通过创建自己的自定义搜索器而不是使用 Umbraco 检查中的默认搜索器来启用前导通配符 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*));
我认为标记的答案无法解决您的问题。您应该调查您正在使用的分析器。
如果您使用 KeywordAnalyzer,则字符串会按原样使用逗号进行索引,并且您必须使用 *,但如果您使用标准分析器,则字符串会根据您的字段以不同的术语拆分,因此 500或 700 应该找到您的节点。
如果您的索引需要 KeywordAnalyser,您可以做的是专门为该字段指定不同的分析器。为此,您必须直接使用 Lucene,而不是检查,并使用 PerFieldAnalyserWrapper
我对 Lucene 搜索查询进行了一些研究,并在互联网上搜索了有关如何执行此操作的答案...但是找不到有效的方法,我的尝试失败了,而不是 return想要。
基本上,我的数据库中有一个字段,它是由逗号连接的 ID,这些字段是 Umbraco 文档属性。
例如,假设我有以下字段的条目:
条目 1:相关内容: 500,700
条目 2:相关内容: 500
我的搜索查询是针对值为 500 的字段,截至目前,它只有 return 条目 2,但是当我通过使用值 500* 使用通配符时,它 return 是他们两个。那很好,但问题是在搜索不乞求价值的东西时。
当我搜索 700 时,returnLucene 上的条目 1 和 WildCard 搜索不允许 * 位于搜索词的开头。
看来我的查询正在搜索必须与搜索词完全相同的值。如果有一种方法可以进行查询,打个比方,比如使用 .Contains() 来搜索字符串中的子字符串,我认为它会解决这个问题。
前导通配符 NOT Lucene 设计支持 (Reference)
如果您的网站不太复杂并且您可以确定性能不是问题,您可以通过创建自己的自定义搜索器而不是使用 Umbraco 检查中的默认搜索器来启用前导通配符 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*));
我认为标记的答案无法解决您的问题。您应该调查您正在使用的分析器。
如果您使用 KeywordAnalyzer,则字符串会按原样使用逗号进行索引,并且您必须使用 *,但如果您使用标准分析器,则字符串会根据您的字段以不同的术语拆分,因此 500或 700 应该找到您的节点。
如果您的索引需要 KeywordAnalyser,您可以做的是专门为该字段指定不同的分析器。为此,您必须直接使用 Lucene,而不是检查,并使用 PerFieldAnalyserWrapper