Elasticsearch检索分类
阅读数:134 评论数:0
跳转到新版页面分类
应用软件
正文
原文:https://blog.csdn.net/laoyang360/article/details/77623013
Elasticsearch中当我们设置Mapping(分词器、字段类型)完毕后,就可以按照设定的方式导入数据。有了数据后,我们可以对数据进行检索。
检索概览
检索子句的行为取决于查询应用filter还是query, filter对应于结构化检索,query对应于全文检索。
GET /_search
{ "query": { "bool": { "must": [
{ "match": { "title": "Search" }},
{ "match": { "content": "Elasticsearch" }}
], "filter": [
{ "term": { "status": "published" }},
{ "range": { "publish_date": { "gte": "2015-01-01" }}}
]
}
}
}
以检索,title中包含“Search”并且content中包含“Elasticsearch”,status中精确定匹配published,并且publish_date大于2015-01-01的全部信息。
1、结构化检索
针对字段类型:日期、时间、数字类型,以及精确的文本匹配。结构化查询得到的结果要么存在于集合中,要么存在集合外,不关心文件的相关度或评分,它简单的对文档包括或排除处理。
(1)精确值查找(必须完全匹配上)
term query
term查询会查找我们指定的精确值,它接受一个字段名以及我们希望查找的数值 。
想要类似mysql中如下sql语句的查询操作:
SELECT document FROM products WHERE price = 20;
DSL写法:
GET /my_store/products/_search
{
"query" : {
"term" : {
"price" : 20
}
}
}
布尔过滤器
一个bool过滤器由三部分组成:
{
"bool" : {
"must" : [],
"should" : [],
"must_not" : [],
"filter": []
}
}
must:所有语句都必须匹配,与AND等价
must_not:所有的语句都不能匹配,与NOT等价
should:至少有一个语句要匹配,与OR等价
filter:必须匹配
GET /my_store/products/_search
{
"query" : {
"filtered" : {
"filter" : {
"bool" : {
"should" : [
{ "term" : {"price" : 20}},
{ "term" : {"productID" : "XHDK-A-1293-#fJ3"}}
],
"must_not" : {
"term" : {"price" : 30}
}
}
}
}
}
}
多个值精确查找
{
"terms" : {
"price" : [20, 30]
}
}
包含20或者含30.
(2)范围检索
gt: > 大于(greater than)
lt: < 小于(less than)
gte: >= 大于或等于(greater than or equal to)
lte: <= 小于或等于(less than or equal to)
类似于Mysql中的范围查询
SELECT document
FROM products
WHERE price BETWEEN 20 AND 40
ES中对应的DSL如下:
GET /my_store/products/_search
{
"query" : {
"constant_score" : {
"filter" : {
"range" : {
"price" : {
"gte" : 20,
"lt" : 40
}
}
}
}
}
}
(3)存在与否检索
mysql中,有如下sql
SELECT tags FROM posts WHERE tags IS NOT NULL;
ES中,exist查询某个字段是否存在:
GET /my_index/posts/_search
{
"query" : {
"constant_score" : {
"filter" : {
"exists" : { "field" : "tags" }
}
}
}
}
若想要exists查询以匹配null类型,需要设置mapping
"user": {
"type": "keyword",
"null_value": "_null_"
(4)前缀检索
GET /_search
{ "query": {
"prefix" : { "user" : "ki" }
}
}
(5)通配符检索
为了防止查询慢,通配符不能以任何一个通配符*或?开头。
GET /_search
{
"query": {
"wildcard" : { "user" : "ki*y" }
}
}
(6)正则表达式检索
GET /_search
{
"query": {
"regexp":{
"name.first": "s.*y"
}
}
}
(7)模糊检索
在指定的最大编辑距离内的所有可能的匹配项,然后检查术语字典,以找出在索引中实际存在待检索的关键字。
GET /_search
{
"query": {
"fuzzy" : { "user" : "ki" }
}
}
(8)类型检索
GET /my_index/_search
{
"query": {
"type" : {
"value" : "xext"
}
}
}
检索索引my_index中,type为xext的全部信息。
(9)Ids检索
GET /my_index/_search
{
"query": {
"ids" : {
"type" : "xext",
"values" : ["2", "4", "100"]
}
}
}
2、全文检索
(1)匹配检索
匹配查询接受文本、数字、日期类型,分析它们,并构造查询。
匹配查询的类型为boolean,这意味着分析所提供的文本,并且分析过程从提供的文本构造一个布尔查询。
文本分析取决于mapping中设定的analyzer(默认是ik分词器)
GET /_search
{
"query": {
"match" : {
"message" : {
"query" : "this is a test",
"operator" : "and"
}
}
}
}
(2)匹配解析检索
类似match查询,match_phrase查询首先将查询字符串解析成一个词项列表,然后对这些词项进行搜索,但只保留那些包含全部搜索词项。
GET /my_index/my_type/_search
{
"query": {
"match_phrase": {
"title": "quick brown fox"
}
}
}
(3)匹配解析前缀检索
match_phrase_prefix与match_phrase相同,除了它允许文本中最后一个术语的前缀匹配。
GET / _search
{
“query”:{
“match_phrase_prefix”:{
“message”:“quick brown f”
}
}
}
(4)多字段匹配检索(暂时不理解)
multi_match查询为能在多个字段上反复执行相同查询提供了一种便捷方式。
(5)字符串检索(暂时不理解)
(6)简化字符串检索(暂时不理解)
最后欢迎大家访问我的个人网站:1024s