【问题标题】:Searching for fields that contains the search term搜索包含搜索词的字段
【发布时间】:2017-07-28 03:38:10
【问题描述】:

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

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

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

条目 1:relatedContents: 500,700

条目 2:relatedContents: 500

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

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

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

【问题讨论】:

    标签: c# umbraco lucene.net examine


    【解决方案1】:

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

    【讨论】:

    • 我目前正在使用自定义搜索器提供程序来使用带有重音符号的搜索词覆盖 Lucene。前几天我尝试测试该搜索,字段:* term * 并且它不起作用,结果我认为这是因为我在这样做之前关闭了 enableLeadingWildcard,因为我正在测试不同的可能性来尝试解决它。我按照你说的做了,而且成功了!感谢您的帮助,很抱歉给您带来不便,我在谷歌上搜索到的所有内容都不是很清楚。
    • 好的,维克多。只想补充一点:当您配置一个新的自定义搜索器提供程序时,请记住通过在 Umbraco 中重新发布至少一个节点或执行以下命令来触发它以重建索引:ExamineManager.Instance.IndexProviderCollection[indexToRebuild].RebuildIndex();
    【解决方案2】:

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

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

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

    【讨论】: