You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Elasticsearch中定义分析器,忽略TLD对域名进行模糊匹配?

解决方案:自定义分析器移除顶级域名(TLD)

你可以通过定义自定义分析器,在索引和搜索阶段自动剥离域名的TLD部分,实现忽略TLD的模糊匹配,具体步骤如下:

1. 创建带自定义分析器的索引

创建索引时,在settings中定义专门处理域名的分析器,核心是用pattern_replace字符过滤器去掉最后一个点之后的所有内容(即TLD):

PUT /domain_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "domain_without_tld": {
          "tokenizer": "keyword",
          "filter": ["lowercase"],
          "char_filter": ["strip_tld"]
        }
      },
      "char_filter": {
        "strip_tld": {
          "type": "pattern_replace",
          "pattern": "\\.[^.]+$",
          "replacement": ""
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "domain": {
        "type": "text",
        "analyzer": "domain_without_tld",
        "search_analyzer": "domain_without_tld"
      }
    }
  }
}

分析器细节:

  • strip_tld字符过滤器:用正则\.[^.]+$匹配最后一个点后的所有字符(比如.com、.net),替换为空,只保留主域名。
  • domain_without_tld分析器:用keyword分词器保持整个主域名作为单个token,搭配lowercase过滤器统一大小写,实现大小写无关匹配。
  • 指定search_analyzer,确保搜索时的查询字符串也会被同样处理(比如输入gogle.net会被转成gogle)。

2. 测试验证

  • 索引文档:
POST /domain_index/_doc/1
{
  "domain": "google.com"
}

此时google.com会被分析成google存入索引。

  • 执行模糊搜索:
GET /domain_index/_search
{
  "query": {
    "fuzzy": {
      "domain": {
        "value": "gogle.net",
        "fuzziness": "AUTO"
      }
    }
  }
}

搜索时gogle.net会被分析器处理成gogle,随后模糊匹配到google,返回目标文档。

补充说明

如果你的域名存在二级以上结构(比如mail.google.com),当前正则会去掉.com保留mail.google;若需要只提取最核心的主域名(比如google),可以把正则调整为\.[^.]+(\.[^.]+)?$,按需选择即可。

内容的提问来源于stack exchange,提问作者Mister_L

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 14:12:07