提问者:小点点

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


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

共2个答案

匿名用户

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,并获得24的匹配项(听起来可能不合逻辑)。

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

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