1、前缀搜索
GET my_index/my_type/_search
{
"query": {
"prefix": {
"title": {
"value": "C3"
}
}
}
}
前缀越短,要处理的doc越多,性能越差,尽可能用长前缀搜索,前缀搜索会进行全扫,就和数据库中的全表扫描,性能很差。
2、通配符搜索
GET my_index/my_type/_search
{
"query": {
"wildcard": {
"title": {
"value": "C?K*5"
}
}
}
}
?:任意字符
*:0个或任意多个字符
性能一样差,必须扫描整个倒排索引,才ok
3、正则搜索
GET /my_index/my_type/_search
{
"query": {
"regexp": {
"title": "C[0-9].+"
}
}
}
[0-9]:指定范围内的数字
[a-z]:指定范围内的字母
.:一个字符
+:前面的正则表达式可以出现一次或多次
4、搜索推荐
GET /my_index/my_type/_search
{
"query": {
"match_phrase_prefix": {
"title": "hello d"
}
}
}
原理跟match_phrase类似,唯一的区别,就是把最后一个term作为前缀去搜索
GET /my_index/my_type/_search
{
"query": {
"match_phrase_prefix": {
"title":{
“query”:"hello d",
“slop”:10,
“max_expansions”:50
}
}
}
}
hello就是去进行match,搜索对应的doc
w,会作为前缀,去扫描整个倒排索引,找到所有w开头的doc
然后找到所有doc中,即包含hello,又包含w开头的字符的doc
根据你的slop去计算,看在slop范围内,能不能让hello w,正好跟doc中的hello和w开头的单词的position相匹配
也可以指定slop,但是只有最后一个term会作为前缀
max_expansions:指定prefix最多匹配多少个term,超过这个数量就不继续匹配了,限定性能
5、什么是ngram/edge ngram
就是分词切分设置
例如:quick,5种长度下的ngram
ngram length=1,q u i c k
ngram length=2,qu ui ic ck
ngram length=3,qui uic ick
ngram length=4,quic uick
ngram length=5,quick
quick,anchor首字母后进行ngram
q
qu
qui
quic
quick
PUT /my_index
{
"settings": {
"analysis": {
"filter": {
"autocomplete_filter":{
"type":"ngram",
"min_gram":1,
"max_gram":20
}
},
"analyzer": {
"autocomplete":{
"type":"custom",
"tokenizer":"standard",
"filter":[
"lowercase","autocomplete_filter"
]
}
}
}
}
}
GET /my_index/_analyze
{
"analyzer": "autocomplete",
"text": "zhuxingyu"
}
6、误拼写时的fuzzy模糊搜索技术
GET /forum/article/_search
{
"query": {
"fuzzy": {
"title": {
"value": "jddva",
"fuzziness": 2
}
}
}
}
fuzzy搜索以后,会自动尝试将你的搜索文本进行纠错,然后去跟文本进行匹配
fuzziness,你的搜索文本最多可以纠正几个字母去跟你的数据进行匹配,默认如果不设置,就是2
另一种写法
GET /forum/article/_search
{
"query": {
"match": {
"title": {
"query": "jdava BLOG",
"fuzziness":"AUTO",
"operator": "and"
}
}
}
}
Operator:包含