【问题标题】:Indexing lucene document with different analysers使用不同的分析器索引 lucene 文档
【发布时间】:2011-06-25 17:27:32
【问题描述】:

可以用两个不同的分析器索引 lucene 文档吗?就像我需要支持区分大小写和不区分大小写的搜索。所以想知道我是否可以对同一个文档使用两个分析器。

writer.addDocument(doc,new StandardAnalyzer(Version.LUCENE_30)); writer.addDocument(doc,new custom_analyser);

我计划有一个自定义分析器,它支持标准分析器所做的所有过滤器,除了小写过滤器。 当我尝试从索引中搜索结果时,我认为我们最终可能会得到重复..

有什么意见/想法吗?

编辑: @西蒙

Analyzer defaultAnalyzer = new StandardAnalyzer(Version.LUCENE_30);
PerFieldAnalyzerWrapper wrapper = new PerFieldAnalyzerWrapper(defaultAnalyzer);
wrapper.addAnalyzer("CaseSensitiveContents", new WhitespaceAnalyzer());

writer = new IndexWriter(FSDirectory.open(index), wrapper, true, 
                         new IndexWriter.MaxFieldLength(100))

doc.add(new Field("contents", parser.getReader(), TermVector.YES));
doc.add(new Field("CaseSensitiveContents", parser.getReader(), TermVector.YES));
writer.add(doc)

【问题讨论】:

    标签: search indexing lucene full-text-search


    【解决方案1】:

    您的示例代码会将两个几乎相同的文档(除了它们的大小写)添加到您的索引中。

    如何在一个文档中添加两个字段,一个区分大小写,一个不区分大小写?您可以为此使用PerFieldAnalyzer

    【讨论】:

    • @Simon,当我尝试将相同的内容添加到两个不同的字段时,我遇到了一个流关闭异常......我该如何解决这个问题?
    • 听起来您要添加两次相同的令牌流?使用纯字符串时,我从未见过此错误。我需要查看一些代码来调试它,最好是在哪里添加 Fieldable(通常是 Field)。
    • 我会调查您对 parser.getReader() 的调用。我不知道该方法的内部工作原理,但我猜它会两次返回相同的读取器/流。它在插入“内容”时被读取,并在需要读取“CaseSensitiveContents”数据时被丢弃。是否可以直接索引字符串?比如new Field("...", parser.getText(), TermVector.YES) 什么的?
    • 嗯..解析器方法是一个 HTML 解析器,它解析 HTML 文件。它撕下 HTML 标签并提供阅读器流。你认为有可能将流读入不同的阅读器 obj 并将该流传递给字段吗?
    • 尝试首先创建两个 html 解析器实例,每个字段一个。这应该表明这是问题所在,还是有其他问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 2013-04-25
    • 2014-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多