Elasticsearch:Search-as-you-type字段类型
(2023-06-03 15:56:27)分类: 数据库es |
search_as_you_type 字段类型是一个类似 text
的字段,经过优化,可以为提供按需输入完成情况的查询提供开箱即用的支持。
它创建了一系列子字段,这些子字段被分析以索引可被部分与整个索引文本值匹配的查询有效匹配的术语。
支持前缀完成(即,匹配项从输入的开头开始)和中缀完成(即,匹配项在输入中的任意位置)。
将这种类型的字段添加到 mapping 时
PUT
my-index-000001
{
"mappings": {
"properties": {
"my_field": {
"type": "search_as_you_type"
}
}
}
}
这将创建以下字段:
my_field 按照
mapping 中的配置进行分析。 如果未配置分析器,则使用索引的默认分词器
my_field._2gram
用大小为 2 的 shingle token filter
分词器对 ny_field 进行分词
my_field._3gram
用大小为 3 的 shingle token filter
分词器对 ny_field 进行分词
my_field._index_prefix
用 edge ngram token filter 包装 my_field._3gram
的分词器
如果你对上面的 edge ngram 以及 shingle 不是很明白的话,你可以参考我之前的文章 “Elasticsearch: Ngrams, edge ngrams, and shingles”。
可以使用 max_shingle_size mapping 参数配置子字段中的 shingles
的大小。 默认值为3,此参数的有效值为整数值2 - 4(含2和4)。 将为从 2 到 max_shingle_size(包括
max_shingle_size)的每个 shingle size 创建 shingle 子字段。
在构造自己的分析器时,my_field._index_prefix 子字段将始终使用带有 max_shingle_size 的
shingle 子字段中的分析器。
增加 max_shingle_size 将改善具有更多连续项的查询的匹配度,但代价是较大的索引大小。 默认的 max_shingle_size 通常应该足够了。
当被索引的文档具有根字段 my_field 的值时,相同的输入文本将使用不同的分析链自动索引到这些字段中的每个字段中。
上面的描述确实有些拗口,不太容易理解。我们还是拿一个简单的例子来展示:
PUT
jobs
{
"mappings": {
"properties": {
"title": {
"type": "search_as_you_type"
}
}
}
}
在上面,我们创建了一个叫做 jobs 的索引。在这个索引中,我们定义了一个叫做 search_as_you_type 的字段 title。
我们来使用如下的 _analyze API 来进行展示:
POST
jobs/_analyze
{
"field": "title",
"text": [
"Senior Software Developer"
]
}
上面的结果显示:
{
"tokens" : [
{
"token" : "senior",
"start_offset" : 0,
"end_offset" : 6,
"type" : "",
"position" : 0
},
{
将这种类型的字段添加到 mapping 时
这将创建以下字段:
my_field
my_field._2gram
my_field._3gram
my_field._index_prefix
如果你对上面的 edge ngram 以及 shingle 不是很明白的话,你可以参考我之前的文章 “Elasticsearch: Ngrams, edge ngrams, and shingles”。
可以使用 max_shingle_size
增加 max_shingle_size 将改善具有更多连续项的查询的匹配度,但代价是较大的索引大小。 默认的 max_shingle_size 通常应该足够了。
当被索引的文档具有根字段 my_field 的值时,相同的输入文本将使用不同的分析链自动索引到这些字段中的每个字段中。
上面的描述确实有些拗口,不太容易理解。我们还是拿一个简单的例子来展示:
在上面,我们创建了一个叫做 jobs 的索引。在这个索引中,我们定义了一个叫做 search_as_you_type 的字段 title。
我们来使用如下的 _analyze API 来进行展示:
上面的结果显示: