wildcard和regexp,与prefix原理一致,都会扫描整个索引,性能不好.在实际应用中,能不用尽可能别用。性能太差了。java
实际场景中,可能有些场景是全文检索,而只能用prefixpython
前缀搜索 顾名思义:对field中的text 进行前缀搜索(根据字符串的前缀去搜索)。其中text 须要不分词。git
C3D0-KD345
C3K5-DFG65
C4I8-UI365
使用C3查询:github
C3 --> 上面这两个都搜索出来 --> 根据字符串的前缀去搜索
建立index(相似 数据库)正则表达式
PUT my_index
{
"mappings": {
"my_type": {
"properties": {
"title": {
"type": "keyword"
}
}
}
}
}
prefix 搜索spring
GET my_index/my_type/_search
{
"query": {
"prefix": {
"title": {
"value": "C3"
}
}
}
}
前缀越短,要处理的doc越多,性能越差,尽量用长前缀搜索数据库
扫描整个倒排索引,举例说明:mybatis
C3-D0-KD345
C3-K5-DFG65
C4-I8-UI365
对以上的text 进行分词,每一个字符串都须要被分词架构
c3 doc1,doc2
d0
kd345
k5
dfg65
c4
i8
ui365
match性能每每是很高的 如搜索关键字c3app
c3 --> 扫描倒排索引 --> 一旦扫描到c3,就能够停了,由于带c3的就2个doc,已经找到了 --> 没有必要继续去搜索其余的term了
由于使用prefix就不分词,没法使用bitset。只能一条一条扫描例如:
C3-D0-KD345
C3-K5-DFG65
C4-I8-UI365
搜索关键字c3
搜索 c3
--> 先扫描到了C3-D0-KD345,很棒,找到了一个前缀带c3的字符串
--> 仍是要继续搜索的,由于后面还有一个C3-K5-DFG65,也许还有其余不少的前缀带c3的字符串
--> 你扫描到了一个前缀匹配的term,不能停,必须继续搜索
--> 直到扫描完整个的倒排索引,才能结束
跟前缀搜索相似,功能更增强大. 性能同样差,必须扫描整个倒排索引
C3D0-KD345
C3K5-DFG65
C4I8-UI365
GET my_index/my_type/_search
{
"query": {
"wildcard": {
"title": {
"value": "C?K*5"
}
}
}
}
wildcard和regexp,与prefix原理一致,都会扫描整个索引,性能不好
GET /my_index/my_type/_search
{
"query": {
"regexp": {
"title": "C[0-9].+"
}
}
}