5

我是 Lucene.NET 的新手。我将字段添加为

Field.Index.NOT_ANALYZED

在 Lucene 文档中。在文档中添加了一个默认字段

Field.Index.ANALYZED

我在搜索默认字段时没有困难;但是当我搜索特定字段时,Lucene 返回 0 文档。但是,如果我改变,

Field.Index.NOT_ANALYZED

Field.Index.ANALYZED

然后一切正常。我认为与分析器有关。任何机构都可以指导我如何搜索Field.Index.NOT_ANALYZED字段吗?

这是我创建查询解析器的方式:

QueryParser parser = 
    new QueryParser(
        Version.LUCENE_30, 
        "content", 
        new StandardAnalyzer(Version.LUCENE_30));
4

2 回答 2

14

ANALYZED只是表示该值在被索引之前通过分析器传递,而NOT_ANALYZED表示该值将按原样索引。后者意味着像“hello world”这样的值将被索引为字符串“hello world”。但是,QueryParser 类的语法将空格解析为术语分隔符,创建两个术语“hello”和“world”。

var q = new TermQuery(new Term(field, "hello world"))如果您创建 a而不是调用,您将能够匹配该字段var q = queryParser.Parse(field, "hello world")

于 2013-07-03T13:18:36.467 回答
2

问题似乎在于使用与当前索引值字面不匹配的搜索值;换句话说,尝试将包含hello world的文档与搜索匹配Hello World。由于您的所有字段都是标记,因为NOT_ANALYZEDLucene 没有处理(使用分析器/标记器)这些术语;它只是在传递它们时进行索引,将像hello world这样的字符串存储为hello world. 对于要在该文档上返回匹配项的搜索,搜索词需要准确

hello world 

不是Hello Worldhello world。你好。所有这些搜索都将返回匹配。对于 Lucene,这就像尝试搜索 number3并获得2or的匹配4项(听起来可能不合逻辑)。

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

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

于 2013-07-03T15:24:17.497 回答