Elasticsearch权威指南:索引时实现搜索即输入功能

Elasticsearch权威指南:索引时实现搜索即输入功能

elasticsearch-definitive-guide The Definitive Guide to Elasticsearch elasticsearch-definitive-guide 项目地址: https://gitcode.com/gh_mirrors/el/elasticsearch-definitive-guide

概念解析

搜索即输入(Search-as-you-type)是现代搜索引擎中提升用户体验的重要功能。Elasticsearch提供了多种实现方式,其中索引时处理是一种高效且灵活的方案。

实现原理

索引时搜索即输入功能的核心是使用边缘N元语法(edge_ngram)分词器。这种分词器会将每个词从起始字符开始,逐步生成递增长度的分词变体。

边缘N元语法示例

对于单词"quick",edge_ngram会生成:

  • q
  • qu
  • qui
  • quic
  • quick

实现步骤

1. 配置自定义分词器

首先需要定义一个edge_ngram分词过滤器:

{
    "filter": {
        "autocomplete_filter": {
            "type":     "edge_ngram",
            "min_gram": 1,
            "max_gram": 20
        }
    }
}

参数说明:

  • min_gram: 最小分词长度
  • max_gram: 最大分词长度

2. 创建自定义分析器

将edge_ngram过滤器与标准分词器结合:

{
    "analyzer": {
        "autocomplete": {
            "type":      "custom",
            "tokenizer": "standard",
            "filter": [
                "lowercase",
                "autocomplete_filter"
            ]
        }
    }
}

3. 完整索引配置

PUT /my_index
{
    "settings": {
        "number_of_shards": 1,
        "analysis": {
            "filter": {
                "autocomplete_filter": {
                    "type":     "edge_ngram",
                    "min_gram": 1,
                    "max_gram": 20
                }
            },
            "analyzer": {
                "autocomplete": {
                    "type":      "custom",
                    "tokenizer": "standard",
                    "filter": [
                        "lowercase",
                        "autocomplete_filter"
                    ]
                }
            }
        }
    }
}

4. 测试分析器

使用分析API验证分词效果:

GET /my_index/_analyze
{
  "analyzer": "autocomplete",
  "text": "quick brown"
}

5. 应用分析器到字段

PUT /my_index/_mapping/my_type
{
    "my_type": {
        "properties": {
            "name": {
                "type":     "string",
                "analyzer": "autocomplete"
            }
        }
    }
}

查询优化

直接使用相同的分析器查询会导致意外匹配,因为查询词也会被分词为N元语法。解决方案是:

方案1:查询时指定标准分析器

GET /my_index/my_type/_search
{
    "query": {
        "match": {
            "name": {
                "query":    "brown fo",
                "analyzer": "standard"
            }
        }
    }
}

方案2:修改字段映射

更优的方案是在字段映射中分别指定索引和搜索分析器:

PUT /my_index/my_type/_mapping
{
    "my_type": {
        "properties": {
            "name": {
                "type":            "string",
                "analyzer":  "autocomplete",
                "search_analyzer": "standard"
            }
        }
    }
}

结构化数据应用

此技术同样适用于结构化数据,如邮政编码。关键点是使用keyword分词器保持数据完整性:

{
    "analysis": {
        "filter": {
            "postcode_filter": {
                "type":     "edge_ngram",
                "min_gram": 1,
                "max_gram": 8
            }
        },
        "analyzer": {
            "postcode_index": {
                "tokenizer": "keyword",
                "filter":    [ "postcode_filter" ]
            },
            "postcode_search": {
                "tokenizer": "keyword"
            }
        }
    }
}

技术对比

边缘N元语法优势

  • 配置灵活
  • 支持任意字段
  • 查询效率高

完成建议器(Completion Suggester)

  • 基于有限状态转换器
  • 内存中操作,响应极快
  • 适合固定顺序的短语(如人名)

最佳实践建议

  1. 对于通用文本搜索,边缘N元语法通常是最佳选择
  2. 对于固定顺序的短语自动完成,考虑使用完成建议器
  3. 结构化数据使用keyword分词器配合edge_ngram
  4. 始终区分索引分析器和搜索分析器
  5. 通过analyze API验证分词效果

通过合理配置索引时分析器,可以构建高效、响应迅速的搜索即输入功能,显著提升用户体验。

elasticsearch-definitive-guide The Definitive Guide to Elasticsearch elasticsearch-definitive-guide 项目地址: https://gitcode.com/gh_mirrors/el/elasticsearch-definitive-guide

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

丁骥治

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值