【问题标题】:Lucene Synonym Filter behaviorLucene 同义词过滤器行为
【发布时间】:2013-06-21 09:50:18
【问题描述】:

我想弄清楚 lucene 的分析器是如何工作的? 我的问题是 lucene 如何处理同义词?情况如下: 我们有单字和多字

单人:foo = bar 多词:foo bar = foobar

对于单个单词:

  • lucene 是否扩展索引记录?我猜如果一个查询有一个像“foo”这样的词,它也会在查询中添加“bar”。我不知道它是否发生在索引上?

对于多字:

  • lucene 是否同时扩展查询和索引?例如,如果我们有“foo bar”,它是否会将 foobar 添加到索引/查询中?

我的第二个问题是:Lucene 使用令牌流并将它们提供给小写过滤器等过滤器。我的问题是 lucene 如何找到多个单词?比如它是如何发现“foo bar”是一个多词在一起的?

谢谢

【问题讨论】:

    标签: lucene synonym


    【解决方案1】:

    SynonymFilter 可以选择保留原始单词,并将同义词也添加到令牌流中,方法是设置keepOrig=true(请参阅SynonymMap.Builder.add())。此行为可能会导致 PhraseQueries 等出现问题,请参阅SynonymFilter 文档中的第一个注意

    如果您使用相同的Analyzer 进行查询和索引,那么写入索引的查询和文档当然会以相同的方式处理。 SynonymFilterkeepOrig 设置为 true 是为数不多的 Analyzers 之一,该Analyzers 经常在查询和索引之间不协调地应用,但这完全取决于您的实现。

    就其实现方式而言,source code 可供您使用。

    【讨论】:

    • 如何处理多同义词?像 "New York" = "NY" wal mart = wal-mart = walmart 因为它按令牌过滤令牌。我不知道它是如何找到多词同义词的
    • 您是否对它的行为感到困惑,或者您想知道实现如何处理令牌流?如果是后者,这就是我提供源代码链接的原因。如果是前者,它会从给定位置贪婪地搜索最长匹配(也就是说,如果你有规则foo -> barfoo bar -> foobar,那么foo bar 将变为@987654336 @,而不是 bar bar)。我不相信它支持wal mart = wal-mart = walmart 之类的东西(同义词规则有一个输入和一个输出)。如果您有什么特别想问的,请继续。
    • 我的问题是它如何处理令牌流?因为我猜同义词过滤器会一一获取令牌并且它是无状态的。例如,如果当前令牌是“New”,它如何检查下一个令牌是否是“York”?
    • 太好了,如果你想知道它的实现细节,the source is there for you
    • 我阅读了代码。我不明白它到底做了什么。 (我不熟悉 lucene 及其结构。)例如我不知道 lucene 是否像其他过滤器一样使用 SynonymFilter?就在我们说 StopFilter 之后?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多