0

我在 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 来查询索引。

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

一些文本 一些文本选择杆 一些文本 一些文本

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

内容:“选档杆”

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

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

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

在此先感谢马丁

4

1 回答 1

0

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

来自Lucene javadocs

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

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

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

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

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

于 2011-08-19T20:54:16.570 回答