【问题标题】:Indexing n-word expressions as a single term in Lucene在 Lucene 中将 n 词表达式索引为单个术语
【发布时间】:2010-09-24 21:13:18
【问题描述】:

我想在 Lucene 中将像“New York”这样的“复合词”作为单个词而不是像“new”、“york”那样索引。这样如果有人搜索“新地方”,包含“纽约”的文档将不会匹配。

我认为 N-gram(实际上是 NGramTokenizer)不是这种情况,因为我不会只索引 任何 n-gram,我只想索引一些特定的 n-gram。

我做了一些研究,我知道我应该编写自己的分析器,也许还应该编写自己的 Tokenizer。但我有点迷失扩展 TokenStream/TokenFilter/Tokenizer。

谢谢

【问题讨论】:

    标签: indexing lucene tokenize


    【解决方案1】:

    我认为您有某种方法可以检测您想要保留的多字单元 (MWU)。然后你可以做的是用下划线替换它们中的空格并使用WhiteSpaceAnalyzer而不是StandardAnalyzer(它会丢弃标点符号),也许使用LowerCaseFilter

    编写自己的Tokenizer 需要相当多的Lucene 黑魔法。我一直无法完全理解 Lucene 2.9+ API,但如果您真的想尝试,请查看 TokenStream 文档。

    【讨论】:

      【解决方案2】:

      我通过创建已编入索引但未分析的字段来做到这一点。 为此,我使用了 Field.Index.NOT_ANALYZED > doc.add(new Field("fieldName", "value", Field.Store.YES, Field.Index.NOT_ANALYZED, TermVector.YES)); 标准分析器。

      我在 Lucene 3.0.2 上工作。

      【讨论】:

      • 但是这样每个字段只会包含一个复合词,对吧?由于字段不会被拆分,Lucene 会认为所有字段都是一个单词,对吧?
      • 字段值不会被拆分是真的。给定字符串“一二三”作为值,它将存储为一个标记。对我来说没关系,因为我存储了 lingpipe 提取的实体:一个实体 - 一个术语。
      猜你喜欢
      • 2011-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-06
      • 2012-02-11
      • 1970-01-01
      相关资源
      最近更新 更多