prefix查询

prefix 查询是一个词级别的底层的查询,它不会在搜索之前分析查询字符串,它假定传入前缀就正是要查找的前缀。



Tip
默认状态下, prefix 查询不做相关度评分计算,它只是将所有匹配的文档返回,并为每条结果赋予评分值 1 。它的行为更像是过滤器而不是查询。 prefix 查询和 prefix 过滤器这两者实际的区别就是过滤器是可以被缓存的,而查询不行。



prefix 查询是如何工作的呢?



为了支持前缀匹配,查询会做以下事情:



扫描词列表并查找到第一个以 W1 开始的词。



搜集关联的文档 ID 。



移动到下一个词。



如果这个词也是以 W1 开头,查询跳回到第二步再重复执行,直到下一个词不以 W1 为止。



这对于小的例子当然可以正常工作,但是如果倒排索引中有数以百万的邮编都是以 W1 开头时,前缀查询则需要访问每个词然后计算结果!



前缀越短所需访问的词越多。如果我们要以 W 作为前缀而不是 W1 ,那么就可能需要做千万次的匹配。



Caution
prefix 查询或过滤对于一些特定的匹配是有效的,但使用方式还是应当注意。当字段中词的集合很小时,可以放心使用,但是它的伸缩性并不好,会对我们的集群带来很多压力。可以使用较长的前缀来限制这种影响,减少需要访问的量



https://blog.csdn.net/chuan442616909/article/details/57907346

https://blog.csdn.net/winterking3/article/details/104919889



prefix
prefix前缀查询,在工作中很常见,就行MySQL里的 like “abc%”。



前缀索引查询
以xx开头的搜索,不计算相关度评分,和filter比,没有bitcache。前缀搜索,尽量把前缀长度设置的更长,性能差,一般大规模产品不使用。(是去倒排索引中去匹配前缀,需要遍历每一个倒排索引才能找到所有匹配的)



语法
GET index/_search
{
“query”: {
“prefix”: {
“title”: {
“value”: “text”
}
}
}
}
为了加快前缀搜索速度,可以设置默认的 前缀索引 (空间换时间)



PUT my_index
{
“mappings”: {
“properties”: {
“text”: {
“type”: “text”,
“index_prefixes”: {
“min_chars”:2,

“max_chars”:4
}

}
}
}
}
上面这个设置的意思是,把分词后的每个词项的2-4个字符额外进行建立前缀倒排索引,从而提高后续前缀匹配的速度,但是占用空间也是相对变大。
index_prefixes: 默认 “min_chars” : 2, “max_chars” : 5 。



通配符查询
通配符查询类似于正则,但没正则强大,允许对匹配表达式进行通配符占位。



表示匹配任意长度的任意字符
? 表示匹配一个任意字符
[…]则表示匹配括号中列出的字符中的任意一个
[!..]表示不匹配括号中列出的字符中的任意一个
语法
{
“query”: {
“wildcard”: {
“text”: {
“value”: “eng?ish”
}
}
}
}
正则查询
regexp查询的性能可以根据提供的正则表达式而有所不同。为了提高性能,应避免使用通配符模式,如.或 .?+未经前缀或后缀



语法
{
“query”: {
“regexp”: {
“name”: {
“value”: “[\s\S]nfc[\s\S]”,
“flags”: “ALL”,
“max_determinized_states”: 10000, #防止正则内存过大的保护措施
“rewrite”: “constant_score”
}
}
}
}
关于参数flags,有几个配置可选:



ALL (Default)
启用所有可选操作符。



COMPLEMENT
启用操作符。可以使用对下面最短的模式进行否定。例如
a~bc # matches ‘adc’ and ‘aec’ but not ‘abc’
INTERVAL
启用<>操作符。可以使用<>匹配数值范围。例如
foo<1-100> # matches ‘foo1’, ‘foo2’ … ‘foo99’, ‘foo100’
foo<01-100> # matches ‘foo01’, ‘foo02’ … ‘foo99’, ‘foo100’



INTERSECTION
启用&操作符,它充当AND操作符。如果左边和右边的模式都匹配,则匹配成功。例如:
aaa.+&.+bbb # matches ‘aaabbb’



ANYSTRING
启用@操作符。您可以使用@来匹配任何整个字符串。
您可以将@操作符与&和~操作符组合起来,创建一个“everything except”逻辑。例如:
@&~(abc.+) # matches everything except terms beginning with ‘abc’



Fuzzy模糊(容错)匹配
场景
1、混淆字符 (box → fox)
2、缺少字符 (black → lack)
3、多出字符 (sic → sick)
4、颠倒次序 (act → cat)



在出现上面情况的时候,我们也希望用户可以搜索到想要的内容,那么这个时候可以使用fuzzy。
https://blog.csdn.net/darkness0604/article/details/108036928



https://www.elastic.co/guide/cn/elasticsearch/guide/current/prefix-query.html


Category elasticsearch