[英]How to search a Field.Index.NOT_ANALYZED field in Lucene.NET?
我是Lucene.NET的新手。 我正在添加字段
Field.Index.NOT_ANALYZED
在Lucene文档中。 有一个默认字段在文档中添加为
Field.Index.ANALYZED
我在搜索默认字段时没有任何困难; 但是当我搜索特定字段时,Lucene返回0文档。 但是,如果我改变,
Field.Index.NOT_ANALYZED
至
Field.Index.ANALYZED
事情正常。 我认为与Analyzer有关。 任何人都可以指导我如何搜索Field.Index.NOT_ANALYZED
字段吗?
以下是我创建查询解析器的方法:
QueryParser parser =
new QueryParser(
Version.LUCENE_30,
"content",
new StandardAnalyzer(Version.LUCENE_30));
ANALYZED
只表示该值在被索引之前通过Analyzer传递,而NOT_ANALYZED
表示该值将按原样索引。 后者意味着像“hello world”这样的值将被编入索引,就像字符串“hello world”一样。 但是,QueryParser类的语法将空格解析为term-separator,创建两个术语“hello”和“world”。
如果您创建了一个var q = new TermQuery(new Term(field, "hello world"))
而不是调用var q = queryParser.Parse(field, "hello world")
您将能够匹配该字段。
问题似乎是使用与字面上与当前索引的值不匹配的搜索值; 换句话说,尝试将包含hello world
文档与搜索Hello World
进行匹配。 由于所有字段都标记为NOT_ANALYZED
Lucene不处理(使用分析器/标记器)条款; 它只是在传递时进行索引,将hello world之类的字符串存储为hello world
。 要搜索返回该文档的匹配项,搜索项必须完全正确
hello world
而不是 , Hello World或hello world。 或你好 。 所有这些搜索都将返回零匹配。 对于Lucene来说,这就像试图搜索数字3
,得到2
或4
的匹配(听起来不合逻辑)。
这就是为什么NOT_ANALYZED
的使用仅建议用于您希望搜索返回完全匹配的ID类型字段,而不是相关/类似字段值的列表。
使用ANALYZED
的优势在于搜索变得更加直观和友好。 索引像hello world
这样的值会将该术语分解为标记(以提供像hello或world或甚至ello的部分匹配)并以全小写形式存储,以避免由于不同的大小写(如Hello World或hELLO )而导致的不匹配。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.