小菜带你用es全文检索框架

本文档详细介绍了如何使用Elasticsearch(ES)进行全文检索,包括批量获取、空搜索、分页搜索和查询字符串搜索。重点讲解了DSL查询与过滤,如match、term、bool、range等查询过滤方式,以及分词与映射的重要性,特别是针对中文的IK分词器的配置和使用。最后,讨论了文档映射的最佳实践,强调了全局映射、动态模板和字段映射的配置策略。
摘要由CSDN通过智能技术生成

文档的简单查询

1.批量获取

mget  API参数是一个 docs数组,数组的每个节点定义一个文档的 _index  、 _type  、 _id  元数据。如果你只想检索一个或几个确定的字段,也可以定义一个 _source  参数:

方式1:GET _mget
{
"docs" : [
{
"_index" : "itsource",
"_type" : "blog",
"_id" : 2
},
{
"_index" : "itsource",
"_type" : "employee",
"_id" : 1,
"_source": ["name","age"]
}
]
}
方式2:同一个索引库的同一个类型下
GET itsource/blog/_mget
{
"ids" : [ "2", "1" ]
}

2.空搜索

没有指定任何的查询条件,只返回集群索引中的所有文档: GET _search

3.分页搜索

和SQL使用 LIMIT  关键字返回只有一页的结果一样,Elasticsearch接受 from  和 size  参数:

size  : 每页条数,默认 10

from  : 跳过开始的结果数,默认 0

如果你想每页显示5个结果,页码从1到3,那请求如下:

GET _search?size=5

GET _search?size=5&from=5

GET _search?size=5&from=10

4.查询字符串搜索

一个搜索可以用纯粹的uri来执行查询。在这种模式下使用搜索,并不是所有的选项都是暴露的。它可以方便快速进行 curl 测试。

查询年龄为25岁的员工

GET itsource/employee/_search?q=age:25

如果q后的参数不指定Fileds则默认查询_all字段(隐含的文档所有字段的连接内容)

类似的查询语法参考lucene,如:

+name:john +tweet:mary

+name:(mary john) +date:>2014-09-10 +(aggregations geo)

age[20 TO 30]

DSL查询与过滤

1.什么是DSL查询

由ES提供丰富且灵活的查询语言叫做DSL查询(Query DSL),它允许你构建更加复杂、强大的查询。

DSL(Domain Specific Language特定领域语言)以JSON请求体的形式出现。我们可以这样表示之前关于“倪先华”的查询:

查询字符串模式:GET itsource/employee/_search?q=fullName:倪先华

DSL模式

GET itsource/employee/_search
{
"query" : {
   "match" : {
   		"fullName" : "倪先华"
}
}
}

对于简单查询,使用查询字符串比较好,但是对于复杂查询,由于条件多,逻辑嵌套复杂,查询字符串不易组织与表达,且容易出错,因此推荐复杂查询通过DSL使用JSON内容格式的请求体代替。

2.DSL查询

使用DSL查询,必须要传递query参数给ES。
GET _search
{"query": YOUR_QUERY_HERE}
一个常用的相对完整的DSL查询:
GET itsource/employee/_search
{
"query": {
   "match": {"sex":"女"}
},
"from": 20, 
"size": 10,
" _source": ["fullName", "age", "email"],
"sort": [{"join_date": "desc"},{"age": "asc"}]
}

上面的DSL查询语句代表:查询公司员工性别为女的员工,并按照加入时间降序、年龄升序排列,最终返回第21条至30条数据(只返回名字、年龄和email字段)

3.DSL过滤

DSL过滤语句和DSL查询语句非常相似,但是它们的使用目的却不同:

DSL过滤查询文档的方式更像是对于我的条件“有”或者“没有”,而DSL查询语句则像是“有多像”。

DSL过滤和DSL查询在性能上的区别:

  • 过滤结果可以缓存并应用到后续请求。
  • 查询语句同时匹配文档,计算相关性,所以更耗时,且不缓存。
  • 过滤语句可有效地配合查询语句完成文档过滤。

原则上,使用DSL查询做全文本搜索或其他需要进行相关性评分的场景,其它全用DSL过滤。

2.0以上的用法
{
"query": {
   "bool": {
          "must": [
{"match": {"description": "search" }}
],
           "filter": {
               "term": {"tags": "lucene"}
           }
    }
}
}
2.0以前的用法
{
"query": {
   "filtered": {
          "query": {
                 "match": {"description": "search" }
            },
           "filter": {
               "term": {"tags": "lucene"}
           }
    }
}
}

4.使用DSL查询与过滤

① 全匹配(match_all)

普通搜索(匹配所有文档):

{

"query" : {

"match_all" : {}

}

}

//如果需要使用过滤条件(在所有文档中过滤,红色部分默认可不写):

{

"query" : {

"bool" 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值