繁体   English   中英

如何在Lucene.NET中搜索Field.Index.NOT_ANALYZED字段?

[英]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 Worldhello world。 你好 所有这些搜索都将返回匹配。 对于Lucene来说,这就像试图搜索数字3 ,得到24的匹配(听起来不合逻辑)。

这就是为什么NOT_ANALYZED的使用仅建议用于您希望搜索返回完全匹配的ID类型字段,而不是相关/类似字段值的列表。

使用ANALYZED的优势在于搜索变得更加直观和友好。 索引像hello world这样的值会将该术语分解为标记(以提供像helloworld或甚至ello的部分匹配)并以全小写形式存储,以避免由于不同的大小写(如Hello WorldhELLO )而导致的不匹配。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM