Elasticsearch(六)---查询

举报
前进的蜗牛 发表于 2023/12/13 10:51:19 2023/12/13
【摘要】 ​ 全文查询matchmatch query会对查询语句进行分词,分词后查询语句中的任何一个词项被匹配,文档都会被搜索到。如果想查询匹配所有关键词的文档,可以用and操作符连接。分词之后匹配的任意一个都可以。因为是orcurl node2:9200/books/_search?pretty -d '{ "query":{ "match":{ "title":{ "query...

 全文查询

match

match query会对查询语句进行分词,分词后查询语句中的任何一个词项被匹配,文档都会被搜索到。如果想查询匹配所有关键词的文档,可以用and操作符连接。

分词之后匹配的任意一个都可以。因为是or

curl node2:9200/books/_search?pretty -d '{
 "query":{
   "match":{
     "title":{
	   "query":"java编程思想",
	   "operator":"or"
	 }
   }
 }
}'

and操作符

curl node2:9200/books/_search?pretty -d '{
 "query":{
   "match":{
     "title":{
   "query":"java编程思想",
   "operator":"and"
 }
   }
 }
}'

match_phrase

match_phrase查询会把query内容分词,分词器可以自定义,同时文档要满足以下两个条件才会被搜索到:

  • 分词后所有词项都要出现在该字段中
  • 字段中的词项顺序要一致。

java编程思想  title

java  编程  思想  编程思想  java编程

curl -XPUT node2:9200/test/test/1?pretty -d '{
  "foo":"I just said hello world"
}'

curl -XPUT node2:9200/test/test/2?pretty -d '{
  "foo":"Hello world"
}'

curl -XPUT node2:9200/test/test/3?pretty -d '{
  "foo":"World Hello"
}'

curl node2:9200/test/_search?pretty -d '{
  "query":{
	"match_phrase":{
	  "foo":"hello world"
	}
  }
}'

match_phrase_prefix

match_phrase_prefix和match_phrase类似,不过match_phrase_prefix支持最后一个term前缀匹配:

curl node2:9200/test/_search?pretty -d '{
  "query":{
    "match_phrase_prefix":{
	  "foo":"hello w"
	}
  }
}'

multi_match

multi_match是match的升级,用于搜索多个字段。查询语句为"java编程",查询域为title和description,查询语句如下:

curl node2:9200/books/_search?pretty -d'{
  "query":{
    "multi_match":{
      "query":"java编程",
      "fields":[ "title", "description" ]
    }
  }
}'

multi_match支持对要搜索的字段名称使用通配符。

curl node2:9200/_search?pretty -d '{
  "query":{
    "multi_match":{
      "query":"java编程",
      "fields":["title", "*_name"]   user_name   pro_name  dev_name
    }
  }
}'

也可以使用指数符指定搜索字段的权重。指定关键词出现在title中的权重是出现在description字段中的3倍。

curl node2:9200/_search?pretty -d '{
  "query":{
    "multi_match":{
      "query":"java编程",
      "fields":["title^3", "description"]
    }
  }
}'

bool查询

bool查询可以把任意多个简单查询组合在一起,使用must、should、must_not、filter选项来表示简单查询之间的逻辑,每个选项都可以出现0次到多次,含义如下:

  • must:文档必须匹配must选项下的查询条件,相当于逻辑运算的AND
  • should:文档可以匹配should选项下的查询条件也可以不匹配,相当于逻辑运算的OR
  • must_not:与must相反,匹配该选项下的查询条件的文档不会被返回。
  • filter:和must一样,匹配filter选项下的查询条件的文档才会被返回,但是filter不评分,只起到过滤作用。


假设要查询title中包含关键字java,并且price不能高于70,description可以包含也可以不包含”虚拟机”的书籍,构造bool查询语句如下:

curl node2:9200/books/_search?pretty -d '{
  "query":{
    "bool":{
      "must":{
        "match":{"title": "java"}
      },
      "should":[
        {"match":{"description":"虚拟机"}}
      ],
      "must_not":{
        "range":{"price":{"gte":70}}
      }
    }
  }
}'

自定义高亮片段:

curl node2:9200/books/_search?pretty -d '{
  "query":{
    "match":{"title":"javascript"}
  },
  "highlight":{
    "fields":{
      "title":{
        "pre_tags":["<strong>"],
        "post_tags":["</strong>"]
      }
    }
  }
}'

curl node2:9200/books/_search?pretty -d '{
  "query":{
    "match":{"title":"javascript"}
  },
  "highlight":{
    "fields":{
      "title":{
        "pre_tags":["<span style=\"color:red\">"],
        "post_tags":["</span>"]
      }
    }
  }
}'



【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。