参考:https://www.phpmianshi.com/?id=160
1.match查询
会先对搜索词进行分词,比如“白雪公主和苹果”,会分成“白雪”“公主”“苹果”。含有相关内容的字段,都会被检索出来。
2.match_phrase查询
match_phrase与slop一起用,能保证分词间的邻近关系,slop参数告诉match_phrase查询词条能够相隔多远时仍然将文档视为匹配,默认是0。为0时 必须相邻才能被检索出来。
例如下面的语句,会把“白雪公主吃苹果”也能检索出来
GET my_index/_search { "query": { "bool": { "must": [ { "match_phrase": { "content": "白雪公主和苹果", "slop":1 } } ] } } }
在对查询字段定义了分词器的情况下,会使用分词器对输入进行分词,然后返回满足下述两个条件的document:
1.match_phase中的所有term都出现在待查询字段之中
2.待查询字段之中的所有term都必须和match_phase具有相同的顺序
3.wildcard查询
是使用通配符进行查询,其中?代表任意一个字符*代表任意的一个或多个字符。
下面的语句会把包含“公主”这个词语的内容检索出来。
GET my_index/_search { "query": { "bool": { "must": [ { "wildcard": { "content": "*公主*" } } ] } } }
这也是一种不分词查询的方法,比如content内容是 aaaa或者中英文数字混合 ,你搜索 aaa的时候match和match_phrase都查不出来
但是用wildcard模糊查询就可以查出来,最好避免在检索词的开头使用 * 或者 ?,这会降低搜索性能。大部分情况后面放个*就满足需求了。
4.regexp查询
基于词条,正则表达式查询的性能在很大程度上取决于所选的正则表达式。匹配像 .* 这样的所有内容非常慢,并且使用环绕正则表达式。如果可能,您应该在正则表达式开始之前尝试使用长前缀。
像 .* ?+这样的通配符匹配器会降低性能,尽量不要使用。
GET my_index/_search { "query": { "bool": { "must": [ { "regexp": { "content": "公主.*苹果" } } ] } } }
参考:https://www.elastic.co/guide/en/elasticsearch/reference/6.2/query-dsl-regexp-query.html
5.prefix查询
基于词条,查询已什么开头的内容,前缀查询映射到Lucene PrefixQuery。
如果满足你的需求,前缀匹配是优于wildcard和regexp。
GET comment/_search { "query": { "bool": { "must": [ { "prefix": { "content": "hhh" } } ] } } }
参考:https://www.elastic.co/guide/en/elasticsearch/reference/6.2/query-dsl-prefix-query.html