如何在ElasticSearch搜索时忽略文档内包含的URL内容
解决方案
Elasticsearch完全可以实现该需求,优先推荐在索引构建阶段过滤掉URL内容,从根源避免URL词汇被分词入库,比搜索时临时过滤性能高、效果更稳定。具体实现方式如下:
方案1:自定义分析器(推荐)
通过在索引配置中新增带pattern_replace字符过滤器的自定义分析器,预处理文本时直接移除所有URL,该方案完全兼容你当前使用的english分析器逻辑,不会影响正文分词效果:
- 创建索引时配置自定义分析器,正则匹配所有HTTP/HTTPS开头的URL并替换为空:
PUT /your_index { "settings": { "analysis": { "char_filter": { "remove_url": { "type": "pattern_replace", "pattern": "https?://\\S+", "replacement": "" } }, "analyzer": { "text_without_url": { "char_filter": ["remove_url"], "tokenizer": "standard", "filter": [ "lowercase", "english_stop", "english_keywords", "english_stemmer" ] } }, "filter": { "english_stop": { "type": "stop", "stopwords": "_english_" }, "english_stemmer": { "type": "stemmer", "language": "english" }, "english_keywords": { "type": "keyword_marker", "keywords": [] } } } }, "mappings": { "properties": { "your_content_field": { "type": "text", "analyzer": "text_without_url" } } } }
- 配置完成后重新导入所有文档,后续入库的文本会自动移除URL再分词,URL里的词汇不会进入倒排索引,match查询自然就不会命中URL内容。
方案2:搜索时临时过滤(适合无法重建索引的场景)
如果不能修改现有索引的分析器配置,可以在match查询时指定search_analyzer为上述自定义的带URL过滤的分析器,搜索时会先把字段内容过滤掉URL再匹配,该方案性能略低于方案1,适合数据量不大的场景:
POST /your_index/_search { "query": { "match": { "your_content_field": { "query": "你的搜索关键词", "analyzer": "text_without_url" } } } }
补充说明
如果你的文档里还有不带HTTP前缀的URL(比如www开头的),可以调整pattern_replace的正则规则扩大匹配范围,比如把pattern改成(https?://|www\\.)\\S+即可覆盖两种常见URL格式。
内容的提问来源于stack exchange,提问作者Bob Fang
相关产品推荐
相关产品推荐

