赞
踩
前缀匹配通过指定一个前缀值,搜索并匹配索引中指定字段的文档,找出那些以该前缀开头的结果。
在 Elasticsearch 中,可以使用 prefix
查询来执行前缀搜索。其基本语法如下:
{
"query": {
"prefix": {
"field_name": {
"value": "prefix_value"
}
}
}
}
其中,field_name
是要进行前缀搜索的字段名,prefix_value
是要匹配的前缀值。
注意:前缀搜索匹配的是term,而不是field,换句话说前缀搜索匹配的是分析之后的词项,并且不计算相关度评分。
优点:
缺点:
index_prefixes
参数允许对词条前缀进行索引,以加速前缀搜索。它接受以下可选设置:
index_prefixe可以理解为在索引上又建了层索引,会为词项再创建倒排索引,会加快前缀搜索的时间,但是会浪费大量空间,本质还是空间换时间。
通配符匹配允许使用通配符来匹配文档中的字段值,是一种基于模式匹配的搜索方法,它使用通配符字符来匹配文档中的字段值。
通配符字符包括 *
和 ?
,其中 *
表示匹配任意数量(包括零个)的字符,而 ?
则表示匹配一个字符。
在通配符搜索中,可以在搜索词中使用通配符字符,将其替换为要匹配的任意字符或字符序列。通配符搜索可以应用于具有文本类型的字段。
注意:通配符搜索和前缀搜索一样,匹配的都是分析之后的词项。
请求示例: 以下是一个使用通配符搜索的示例请求:
GET /my_index/_search
{
"query": {
"wildcard": {
"title.keyword": {
"value": "elast*"
}
}
}
}
在上述示例中,我们对名为 my_index
的索引执行了一个通配符搜索。我们指定了要搜索的字段为 title.keyword
,并使用 elast*
作为通配符搜索词。这将匹配 title.keyword
字段中以 elast
开头的任意字符序列。
正则表达式匹配(regexp)是一种基于正则表达式模式进行匹配的搜索方法,它允许使用正则表达式来匹配文档中的字段值。
用途: 正则表达式匹配在以下情况下非常有用:
优缺点:
语法:
GET <index>/_search
{
"query": {
"regexp": {
"<field>": {
"value": "<regex>",
"flags": "ALL",
}
}
}
}
请求示例: 以下是一个使用正则表达式匹配的示例请求:
GET /my_index/_search
{
"query": {
"regexp": {
"title.keyword": {
"value": "elast.*",
"flags": "ALL"
}
}
}
}
在上述示例中,我们对名为 my_index
的索引执行了一个正则表达式匹配。我们指定要搜索的字段为 title.keyword
,并使用 elast.*
作为正则表达式匹配模式。这将匹配 title.keyword
字段中以 elast
开头的字符序列,并且后面可以是任意字符。
注意:regexp查询的性能可以根据提供的正则表达式而有所不同。为了提高性能,应避免使用通配符模式,如 .
或 .?+
未经前缀或后缀。
正则表达式匹配的 flags
参数用于指定正则表达式的匹配选项。它可以修改正则表达式的行为以进行更灵活和精确的匹配。
语法: 在正则表达式匹配的查询中,flags
参数是一个字符串,它可以包含多个选项,并用逗号分隔。每个选项都由一个字母表示。
以下是常用的 flags
参数选项及其说明:
ALL
:启用所有选项,相当于同时启用了 ANYSTRING
, COMPLEMENT
, EMPTY
, INTERSECTION
, INTERVAL
, NONE
, NOTEMPTY
, 和 NOTNONE
。ANYSTRING
:允许使用 .
来匹配任意字符,默认情况下 .
不匹配换行符。COMPLEMENT
:求反操作,匹配除指定模式外的所有内容。EMPTY
:匹配空字符串。INTERSECTION
:允许使用 &&
运算符来定义交集。INTERVAL
:允许使用 {}
来定义重复数量的区间。NONE
:禁用所有选项,相当于不设置 flags
参数。NOTEMPTY
:匹配非空字符串。NOTNONE
:匹配任何内容,包括空字符串。flags参数用到的场景比较少,做下了解即可。
模糊查询(Fuzzy Query)是 Elasticsearch 中一种近似匹配的搜索方式,用于查找与搜索词项相似但不完全相等的文档。基于编辑距离(Levenshtein 距离)计算两个词项之间的差异。
它通过允许最多的差异量来匹配文档,以处理输入错误、拼写错误或轻微变体的情况。
用途:纠正拼写错误,模糊查询可用于纠正用户可能犯的拼写错误,可以提供宽松匹配,使搜索结果更加全面。
请求示例:
GET /my_index/_search
{
"query": {
"fuzzy": {
"title": {
"value": "quick",
"fuzziness": "2"
}
}
}
}
fuzziness
是编辑距离,即:编辑成正确字符所需要挪动的字符的数量
先来了解下match_phrase,match_phrase检索有如下特点:
match_phrase_prefix
与match_phrase
相同,但是它多了一个特性,就是它允许在文本的最后一个词项(term)上的前缀匹配。
如果是一个单词,比如a,它会匹配文档字段所有以a开头的文档,如果是一个短语,比如 “this is ma” ,他会先在倒排索引中做以ma做前缀搜索,然后在匹配到的doc中以 “this is” 做match_phrase查询。
match_phrase_prefix
查询是一种结合了短语匹配和前缀匹配的查询方式。它用于在某个字段中匹配包含指定短语前缀的文档。
具体来说,match_phrase_prefix
查询会将查询字符串分成两部分:前缀部分和后缀部分。然后它会先对前缀部分进行短语匹配,找到以该短语开头的文档片段;接下来,针对符合前缀匹配的文档片段,再对后缀部分进行前缀匹配,从而进一步筛选出最终匹配的文档。
以下是 match_phrase_prefix
查询的示例:
GET /my_index/_search
{
"query": {
"match_phrase_prefix": {
"title": {
"query": "quick brown f",
"max_expansions": 10
}
}
}
}
解释:
match_phrase_prefix
查询。title
,我们要求匹配的短语是 “quick brown f”。max_expansions
参数用于控制扩展的前缀项数量(默认为 50)。这里我们设置为 10,表示最多扩展 10 个前缀项进行匹配。match_phrase_prefix
查询适用于需要同时支持短语匹配和前缀匹配的场景。例如,当用户输入一个搜索短语的前缀时,可以使用该查询来获取相关的文档结果。
ngram 和 edge ngram 是两种用于分析和索引文本的字符级别的分词器。
参数:
以下是一个示例来说明如何在 Elasticsearch 中使用 ngram 和 edge ngram 分词器:
PUT /my_index { "settings": { "analysis": { "analyzer": { "my_ngram_analyzer": { "tokenizer": "my_ngram_tokenizer" }, "my_edge_ngram_analyzer": { "tokenizer": "my_edge_ngram_tokenizer" } }, "tokenizer": { "my_ngram_tokenizer": { "type": "ngram", "min_gram": 2, "max_gram": 4 }, "my_edge_ngram_tokenizer": { "type": "edge_ngram", "min_gram": 2, "max_gram": 10 } } } }, "mappings": { "properties": { "title": { "type": "text", "analyzer": "my_ngram_analyzer" }, "keyword": { "type": "text", "analyzer": "my_edge_ngram_analyzer" } } } }
在上述示例中,我们创建了一个名为 my_index
的索引,定义了两个不同的分词器和对应的字段映射:
my_ngram_analyzer
使用了 ngram 分词器,适用于处理 title
字段。my_edge_ngram_analyzer
使用了 edge ngram 分词器,适用于处理 keyword
字段。通过在查询时指定相应的分析器,可以使用这些分词器来进行文本搜索、前缀搜索等操作。
注意:ngram 作为 tokenizer 的时候会把空格也包含在内,而作为 token filter 时,空格不会作为处理字符。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。