Lucene.net中带有特殊字符的确切短语

时间:2011-08-10 13:20:22

标签: .net lucene phrase

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

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

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

然后将查询添加到BooleanQuery中,该BooleanQuery用于从IndexSearcher获取结果。我认为其余的代码并不重要,因为代码的工作方式与99%的查询一样。我也使用StandardAnalyzer来查询索引。

现在问题就在于此。 有时,文档的“内容”字段包含使用“ - ”

分隔的文本
  

一些文字有些文字选择杠杆有些文字有些文字

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

  

内容:“选择杆”

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

我认为它与分析器有关,而且“ - ”是lucene中的一个特殊字符。

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

提前谢谢 马丁

1 个答案:

答案 0 :(得分:0)

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

来自Lucene javadocs

  

使用JFlex构建的基于语法的标记生成器

     

这应该是大多数欧洲语言文档的良好标记器:

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

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

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