es 全文查询主要用在文本字段上,主要考虑查询语句与文档的相关性(Relevance)。
match query 用于搜索单个字段,首先会针对查询语句进行解析(经过 analyzer),主要是对查询语句进行分词,分词后查询语句的任何一个词项被匹配,文档就会被搜到,默认情况下相当于对分词后词项进行 or 匹配操作。
GET article/_search
{
"query": {
"match": {
"title": {
"query": "Elasticsearch 查询优化"
}
}
}
}
等同于 or 匹配操作,如下:
GET article/_search
{
"query": {
"match": {
"title": {
"query": "Elasticsearch 查询优化",
"operator": "or"
}
}
}
}
如果想查询匹配所有关键词的文档,可以用 and 操作符连接,如下:
GET article/_search
{
"query": {
"match": {
"title": {
"query": "Elasticsearch 查询优化",
"operator": "and"
}
}
}
}
match_phrase query 首先会把 query 内容分词,分词器可以自定义,同时文档还要满足以下两个条件才会被搜索到:
例如,有以下 3 个文档,使用 match_phrase 查询只有前两个文档会被匹配:
PUT test_idx/test_tp/1
{ "desc": "what a wonderful life" }
PUT test_idx/test_tp/2
{ "desc": "what a life"}
PUT test_idx/test_tp/3
{ "desc": "life is what"}
GET test_idx/test_tp/_search
{
"query": {
"match_phrase": {
"desc": "what life"
}
}
}
match_phrase_prefix 和 match_phrase 类似,只不过 match_phrase_prefix 支持最后一个词进行前缀匹配。
GET test_idx/test_tp/_search
{
"query": {
"match_phrase_prefix": {
"desc": "what li"
}
}
}
multi_match 是 match 的升级,用于搜索多个字段。查询语句为“java 编程”,查询域为 title 和 description,查询语句如下:
GET books/_search
{
"query": {
"multi_match": {
"query": "java 编程",
"fields": ["title", "description"]
}
}
}
multi_match 支持对要搜索的字段的名称使用通配符,示例如下:
GET books/_search
{
"query": {
"multi_match": {
"query": "java 编程",
"fields": ["title", "*_name"]
}
}
}
同时,也可以用指数符号指定搜索字段的权重。指定关键词出现在 title 中的权重是出现在 description 字段中的 3 倍,命令如下:
GET books/_search
{
"query": {
"multi_match": {
"query": "java 编程",
"fields": ["title^3", "description"]
}
}
}
query_string query 是与 Lucene 查询语句的语法结合非常紧密的一种查询,允许在一个查询语句中使用多个特殊条件关键字(如:AND | OR | NOT)对多个字段进行查询
运算符
“default_operator”:“运算符” 有AND、OR,默认为OR。 比如query里面的内容是 ”搜索服务器”,那么只要分词集中包含之一就可以匹配。
如果"default_operator":“AND”, 那么就是全匹配 比如: query里面的内容是 ”搜索服务器” 那么只要分词集内词能拼出 ”搜索服务器” 这整句话就可以匹配
通配符
支持一些简单的wildcard写法。比如fields:["nam*"]
`即任何nam开头的字段
?
与*
, ?
可以代替一个任意字符、 *
可代表任意个字符(包括零个)
比如你要查询的内容很长,记不清了但是你记得末尾是tor,那么你只需要把query内容写成*tor即可
正则
如果要在query的内容中使用正则表达式,在两端加上正斜杠/即可。比如: name:/ob[am]{2}a/
GET /testindex/_search
{
"query":{
"query_string":{
"default_field":"title",
"query":"搜索服务器"
}
}
}