【Elasticsearch】为一个字段配置多个分析器

在Elasticsearch中,混合精确搜索与词干提取(Mixing Exact Search with Stemming)是一个常见的需求,尤其是在处理自然语言文本时。词干提取(Stemming)是一种语言处理技术,用于将单词的不同形态(如单复数、动词的不同时态)归一化为基本形式(词干)。例如,"skiing"、"skis"和"ski"都可能被归一化为"ski"。这种技术有助于提高搜索的灵活性和召回率,但也可能导致用户无法精确搜索到特定的单词形式。

为了同时支持词干提取和精确搜索,Elasticsearch提供了一种解决方案,即通过多字段(multi-field)和`quote_field_suffix`参数来实现。以下是详细说明:


1.多字段(Multi-Field)的使用

在Elasticsearch中,可以通过为同一个字段定义多个子字段(multi-field)来实现不同的分析方式。例如,对于一个字段`body`,可以定义两个子字段:

• `body`:使用默认的词干提取分析器(如`english`分析器)。

• `body.exact`:使用不进行词干提取的分析器(如`english_exact`分析器)。

这样,用户可以根据需要选择使用词干提取的字段(`body`)或精确匹配的字段(`body.exact`)。

示例:创建索引和字段

```json

PUT /example_index

{

"settings": {

"analysis": {

"analyzer": {

"english_exact": {

"tokenizer": "standard",

"filter": ["lowercase"]

}

}

}

},

"mappings": {

"properties": {

"body": {

"type": "text",

"analyzer": "english",

"fields": {

"exact": {

"type": "text",

"analyzer": "english_exact"

}

}

}

}

}

}

```

• `body`字段:使用`english`分析器,会进行词干提取。

• `body.exact`字段:使用`english_exact`分析器,仅进行小写处理,不进行词干提取。


2.`quote_field_suffix`参数的使用

虽然多字段可以解决精确搜索和词干提取的问题,但直接让用户选择字段可能会增加复杂性。Elasticsearch提供了一个更优雅的解决方案:`quote_field_suffix`参数。

`quote_field_suffix`允许用户在查询中通过引号(`"`)指定需要精确匹配的单词。Elasticsearch会自动将引号内的单词重定向到指定的字段(如`.exact`字段),而其他单词则使用默认字段(如`body`字段)。

示例:使用`quote_field_suffix`进行查询

假设我们有以下文档:

```json

PUT /example_index/_doc/1

{

"body": "Ski resort"

}

PUT /example_index/_doc/2

{

"body": "A pair of skis"

}

```

• 查询1:使用词干提取搜索

查询`ski`时,返回所有包含`ski`、`skis`或`skiing`的文档。

```json

GET /example_index/_search

{

"query": {

"simple_query_string": {

"fields": ["body"],

"query": "ski"

}

}

}

```

结果:

```json

{

"hits": [

{"_source": {"body": "Ski resort"}},

{"_source": {"body": "A pair of skis"}}

]

}

```

• 查询2:精确搜索

使用引号指定精确匹配:

```json

GET /example_index/_search

{

"query": {

"simple_query_string": {

"fields": ["body"],

"quote_field_suffix": ".exact",

"query": "\"ski\""

}

}

}

```

结果:

```json

{

"hits": [

{"_source": {"body": "Ski resort"}}

]

}

```

在这个例子中,`"ski"`被放在引号内,因此Elasticsearch会将其重定向到`body.exact`字段,从而实现精确匹配。


3.混合使用精确搜索和词干提取

`quote_field_suffix`参数的一个强大之处在于,它允许用户在同一个查询中混合使用精确搜索和词干提取。例如:

```json

GET /example_index/_search

{

"query": {

"simple_query_string": {

"fields": ["body"],

"quote_field_suffix": ".exact",

"query": "\"ski\" resort"

}

}

}

```

• `"ski"`:精确匹配,使用`body.exact`字段。

• `resort`:使用词干提取,使用`body`字段。

这种混合方式使得用户可以根据需要灵活地选择精确匹配和模糊匹配,而无需手动指定字段。


4.总结

在Elasticsearch中,混合精确搜索与词干提取是一种常见的需求。通过以下方式可以实现:

• 多字段(Multi-Field):为同一个字段定义多个子字段,分别用于词干提取和精确匹配。

• `quote_field_suffix`参数:允许用户通过引号指定精确匹配的单词,同时保留词干提取的功能。

这种设计不仅提高了搜索的灵活性,还简化了用户的查询体验,使得用户可以根据需要灵活选择精确匹配或模糊匹配。

相关推荐
fruge4 小时前
git上传 项目 把node_modules也上传至仓库了,在文件.gitignore 中忽略node_modules 依然不行
大数据·git·elasticsearch
飞火流星020277 小时前
ElasticSearch公共方法封装
elasticsearch·搜索引擎·es鉴权·es代理访问·es公共方法封装·es集群访问·判断es索引是否存在
vvvae12348 小时前
Elasticsearch实战应用:从“搜索小白”到“数据侦探”的进阶之路
elasticsearch
yinbp8 小时前
bboss v7.3.5来袭!新增异地灾备机制和Kerberos认证机制,助力企业数据安全
大数据·elasticsearch·微服务·etl·restclient·bboss
m0_748255028 小时前
Springboot中使用Elasticsearch(部署+使用+讲解 最完整)
spring boot·elasticsearch·jenkins
Elastic 中国社区官方博客8 小时前
Elasticsearch 自动补全搜索 - autocomplete
大数据·数据库·elasticsearch·搜索引擎·全文检索
Elastic 中国社区官方博客14 小时前
Elasticsearch 混合搜索 - Hybrid Search
大数据·人工智能·elasticsearch·搜索引擎·ai·语言模型·全文检索
KimiKudo14 小时前
记录一个ES分词器不生效的解决过程
elasticsearch
{⌐■_■}14 小时前
【git】工作场景下的 工作区 <-> 暂存区<-> 本地仓库 命令实战 具体案例
大数据·git·elasticsearch·golang·iphone·ip·etcd