我是Lucene.NET新手。我正在添加字段作为
Field.Index.NOT_ANALYZED
在Lucene文档中。文档中添加了一个默认字段
Field.Index.ANALYZED
我在搜索默认字段时没有困难;但是当我在特定字段上搜索时,Lucene返回0文档。但是如果我改变,
Field.Index.NOT_ANALYZED
到
Field.Index.ANALYZED
然后事情正常工作。我认为这与分析器有关。有人能指导我如何搜索字段。索引。NOT_ANALYZED
字段吗?
以下是我创建查询解析器的方式:
QueryParser parser =
new QueryParser(
Version.LUCENE_30,
"content",
new StandardAnalyzer(Version.LUCENE_30));
ANALYZED
只是意味着该值在被索引之前通过Analyzer传递,而NOT_ANALYZED
意味着该值将按原样被索引。后者意味着像“hello world”这样的值将被索引为字符串“hello world”。但是,QueryParser类的语法将空格解析为术语分隔符,创建两个术语“hello”和“world”。
如果您创建了一个var q=new TermQuery(new Term(field,"hello world"))
而不是调用var q=queryParser. Parse(field,"hello world")
,您将能够匹配该字段。
问题似乎是使用的搜索值与当前索引的值不匹配;换句话说,试图将包含hello world
的文档与搜索Hello World
相匹配。由于您的所有字段都标记为NOT_ANALYZEDLucene没有处理(使用分析器/标记器)术语;它只是在传递时对其进行索引,将像hello world这样的字符串存储为
hello world
。要在该文档上返回匹配项,搜索词需要完全
hello world
而不是Hello World或hello world。或Hello。所有这些搜索都将返回零个匹配项。对于Lucene,这就像尝试搜索数字3
,并获得2
或4
的匹配项(听起来可能不合逻辑)。
这就是为什么只建议对ID类型字段使用NOT_ANALYZED
,因为您希望搜索返回完全匹配,而不是相关/相似字段值的列表。
使用ANALYZED
的优点是搜索变得更加直观和友好。索引像hello world
这样的值会将术语分解为标记(以提供部分匹配,如hello或world甚至ello)并以全小写存储,以避免由于大小写不同而导致的不匹配(如Hello World或hELLO)。