我在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中的一个特殊字符。
也许有人可以帮我解决这个问题。
提前谢谢 马丁答案 0 :(得分:0)
您认为问题是您在索引时使用的分析器是正确的。
使用JFlex构建的基于语法的标记生成器
这应该是大多数欧洲语言文档的良好标记器:
- 在标点字符处拆分单词,删除标点符号。但是,没有空格的点被视为令牌的一部分。
- 在拼音中拆分单词,除非令牌中有数字,在这种情况下,整个令牌被解释为产品编号而不会被拆分。
- 将电子邮件地址和互联网主机名识别为一个令牌。
许多应用程序都有特定的tokenizer需求。如果此tokenizer不适合您的应用程序,请考虑将此源代码目录复制到您的项目并维护您自己的基于语法的tokenizer。
因此,在您的情况下,您需要使用更严格的分析器来索引您的文档,例如WhitespaceAnalyzer
,它只会在空格上分割。