【问题标题】:Handling + as a special character in Lucene search在 Lucene 搜索中将 + 作为特殊字符处理
【发布时间】:2009-10-21 02:39:21
【问题描述】:

当我的输入字符串包含像 c++ 这样的术语时,如何确保 lucene 给我返回相关的搜索结果? Lucene 似乎忽略了 ++ 字符。

代码详情: 当我执行这一行时,我得到一个空白的搜索查询。

queryField = multiFieldQueryParser.Parse(inpKeywords);

keywordsQuery.Add(queryField, BooleanClause.Occur.SHOULD);

这是我的自定义分析器:

public class CustomAnalyzer : Analyzer
    {
        private static readonly WhitespaceAnalyzer whitespaceAnalyzer = new WhitespaceAnalyzer();
    public override TokenStream TokenStream(String fieldName, System.IO.TextReader reader)
        {
            TokenStream result = whitespaceAnalyzer.TokenStream(fieldName, reader);
            result = new StandardTokenizer(reader);
            result = new LowerCaseFilter(result);
            result = new StopFilter(result, stop_words);
            return result;
        }
}

我正在以这种方式执行搜索查询:

indexSearcher.Search(searchQuery, collector);

我确实尝试了 queryField = multiFieldQueryParser.Parse(QueryParser.Escape(inpKeywords));,但它仍然不起作用。这是执行并返回零命中的查询。 "+(())"

谢谢。

【问题讨论】:

    标签: lucene lucene.net


    【解决方案1】:

    因为+是一个特殊字符,所以需要转义。所有需要转义的字符列表为here(见页面底部。)

    您还需要注意索引时使用的分析器。例如,StandardAnalyzer 将跳过+。您可能需要在索引和搜索时使用 WhiteSpaceAnalyzer 之类的东西,这将保留令牌流中的特殊字符。请记住,您需要在索引和搜索时使用相同的分析器。

    【讨论】:

    • 我只使用 WhiteSpaceAnalyzer...但仍然会忽略 + 字符
    【解决方案2】:

    除了选择正确的分析器外,您还可以使用QueryParser.Escape(string s) 来确保所有特殊字符都被正确转义。

    因为这是一个静态函数,所以您可以使用它,即使您使用的是 MultiFieldQueryParser。

    例如,您可以尝试这样的操作:

    queryField = multiFieldQueryParser.Parse(QueryParser.Escape(inpKeywords));
    

    【讨论】:

    • 再次感谢 Jesse 的回复。我确实尝试了 queryField = multiFieldQueryParser.Parse(QueryParser.Escape(inpKeywords));,但它仍然不起作用。这是执行并返回零命中的查询。 "+(())"
    • 嘿 Ed,它是否适用于没有 Escape 功能的简单关键字?如果是这样,也许发布更多与您的 Searcher 和 QueryParser 对象相关的代码。还请记住,您必须使用用于索引的分析器进行搜索。
    【解决方案3】:

    尝试对您的搜索查询进行 UTF-8 编码。

    您可以按照this article中的说明启用此功能

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-24
      • 1970-01-01
      • 2023-03-25
      • 1970-01-01
      • 2015-07-19
      • 1970-01-01
      相关资源
      最近更新 更多