【问题标题】:Exact phrase with special characters in Lucene.netLucene.net 中带有特殊字符的精确短语
【发布时间】:2011-08-10 13:20:21
【问题描述】:

我在 lucene.net 中进行全文搜索时遇到问题,其中搜索结果包含特殊的 lucene 字符。

我的 Lucene 文档中有一个名为“内容”的字段。该字段创建如下,包含索引文档的内容:

document.Add(new Field("content", fulltext, Field.Store.YES, Field.Index.ANALYZED));

为了创建索引,我使用 Standardanalyzer。

为了查询索引,我使用以下代码:

var queryParser = new QueryParser(Lucene.Net.Util.Version.LUCENE_29, "content", analayzer);
queryParser.SetAllowLeadingWildcard(true);
queryParser.SetMultiTermRewriteMethod(MultiTermQuery.SCORING_BOOLEAN_QUERY_REWRITE);
Query fullTextQuery = queryParser.Parse(queryString);

然后将查询添加到用于从 IndexSearcher 获取结果的 BooleanQuery。我认为其余的代码并不那么重要,因为对于 99% 的查询,代码的工作方式都应该如此。我也在使用 StandardAnalyzer 来查询索引。

现在问题来了。 有时,文档的“内容”字段包含使用“-”分隔的文本

some text some text selector-lever some text some text

现在,当我使用“选择杆”进行全文搜索(精确短语)时。查询如下所示:

content:"选档杆"

这里的问题是也找到了包含上述文本的文档,虽然它不应该被找到,因为这两个单词是用“-”分隔的,而不是空白。

我认为这与分析器有关,并且“-”是 lucene 中的特殊字符。

也许有人可以帮我解决这个问题。

提前致谢 马丁

【问题讨论】:

    标签: .net lucene phrase


    【解决方案1】:

    您认为问题在于您在索引时使用的分析器是正确的。

    来自Lucene javadocs

    使用 JFlex 构建的基于语法的分词器

    这对于大多数欧洲语言文档来说应该是一个很好的标记器:

    • 在标点字符处拆分单词,删除标点符号。但是,后面没有空格的点会被视为标记的一部分。
    • 在连字符处拆分单词,除非标记中有数字,在这种情况下,整个标记被解释为产品编号并且不分割
    • 将电子邮件地址和互联网主机名识别为一个令牌。

    许多应用程序都有特定的标记器需求。如果此分词器不适合您的应用程序,请考虑将此源代码目录复制到您的项目并维护您自己的基于语法的分词器。

    因此,在您的情况下,您需要使用更严格的分析器来索引您的文档,例如 WhitespaceAnalyzer,它只在空白处拆分。

    【讨论】:

    • 4年后的一个问题。作为标准分析器删除标点符号,当涉及到搜索时,查询解析器也会删除标点符号。这导致荧光笔,标记单词忽略单词的最后/第一个标点符号。我不想使用 WhitespaceAnalyzer,因为它限制了搜索结果。关于如何克服未突出显示的单词的最后一个标点符号的任何想法?
    • @JenonD 太久了,我想我不能帮助你。如果您愿意,我建议发布一个新问题并参考这个问题。
    猜你喜欢
    • 1970-01-01
    • 2018-09-11
    • 2021-09-18
    • 1970-01-01
    • 2023-03-14
    • 2012-10-06
    • 2018-11-14
    • 2012-09-15
    • 2017-03-15
    相关资源
    最近更新 更多