【问题标题】:Indexing content in Solr and Lucene and matching on concatenated email username在 Solr 和 Lucene 中索引内容并匹配连接的电子邮件用户名
【发布时间】:2026-02-13 07:40:02
【问题描述】:

我正在将原始内容索引到文档中,对于包含电子邮件(例如 robby.pond@email.com)的文档,我需要在文档中搜索 robbypond。

目前我正在使用 ClassicTokenizer(也用于电话号码的特殊处理)和 WordDelimiterGraphFilter,这是一个简化的分析器链。

<fieldType name="text" class="solr.TextField" positionIncrementGap="100">
    <analyzer type="index">
      <tokenizer class="solr.WhitespaceTokenizerFactory"/>
      <filter class="solr.WordDelimiterGraphFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1"/>
    </analyzer>
    <analyzer type="query">
      <tokenizer class="solr.WhitespaceTokenizerFactory"/>
      <filter class="solr.WordDelimiterGraphFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1"/>
    </analyzer>
</fieldType> 

这会生成以下所有类型为 EMAIL 的令牌。

robbypondgmailcom 罗比池 gmail com

问题是我有一个要求,比如 robbypond 之类的搜索会命中文档。是否有任何现有的过滤器或一组参数可用于连接 robby 和 pool 令牌并将 robbypond 令牌添加到令牌流?

【问题讨论】:

  • Shingle 过滤器将为您连接连续的标记,并带有可选的分隔符:lucene.apache.org/solr/guide/8_7/… - 但这取决于您需要这些匹配的精确程度(即您将丢失有关 gmail 的元数据.com 在@ 之后,因此您还将获得pondgmail 作为令牌)。
  • @Robby 你有没有机会仔细阅读我的答案,如果你有任何疑问,请随时发表评论,已经有一段时间了,如果你能提供更新会很棒:)

标签: elasticsearch search solr lucene


【解决方案1】:

您可以使用mapping char filter,它在分词器之前执行,可以将. 替换为空字符,这样只有相关的令牌才能组合在一起,而Shingles 则成本非常高。

创建此类分析器的示例设置

{
    "settings": {
        "analysis": {
            "analyzer": {
                "my_analyzer": {
                    "tokenizer": "standard",
                    "char_filter": [
                        "replace_dots"
                    ]
                }
            },
            "char_filter": {
                "replace_dots": {
                    "type": "mapping",
                    "mappings": [
                        ". =>"
                    ]
                }
            }
        }
    }
}

并使用分析 API 来检查测试令牌

POST /_分析

{
    "text" : "robby.pond@email.com",
    "analyzer" : "my_analyzer"
}

并生成令牌

{
    "tokens": [
        {
            "token": "robbypond",
            "start_offset": 0,
            "end_offset": 10,
            "type": "<ALPHANUM>",
            "position": 0
        },
        {
            "token": "emailcom",
            "start_offset": 11,
            "end_offset": 20,
            "type": "<ALPHANUM>",
            "position": 1
        }
    ]
}

【讨论】:

    最近更新 更多