1 Search API
- URI Search
在URL中使用查询参数 - Request Body Search
使用Elasticsearch提供的,基于JSON的更完备的查询(DSL)
语法 | 范围 |
---|---|
/_search | 集群上所有的索引 |
/index1/_search | index1 |
/index1,index2/_search | index1,index2 |
/index*/_search | 以index开头的索引 |
2.搜索的相关性
- 用户关心的相关性
- 是否可以找到所有相关的内容
- 有多少相关的内容被返回
- 文档的打分是否合理
- 结合业务需求,平衡结果排名
- Web搜索 (Page Rank算法)
- 不仅仅是内容
- 更重要的的是可信度
- 相关性的衡量
- Precision(查准率),尽可能返回较少的无关文档
- Recision(相关内容),尽可能返回多的相关的文档
- Ranking - 是否能够按照相关度进行排序
3.URI Search详解
3.1URI Query实现搜索
格式:GET /index_name/_search?
查询字符串:q=china&df=title&sort=year:desc&from=0&size=1&timeout=1s
{
"profile":true
}
- q:指定查询语句,使用
Query String Syntax
- df:默认字段,不指定会对所有的字段查询
- sort: 排序
- from和size:用于分页
- profile:true,可以查看是如何执行的。
3.2 Query String Syntax Part1
- 指定字段的查询和泛查询
- q=title:2012/q=2012&df=title
- q=title
- Term和Phrase
- Beautiful Mind,等效 Beautiful OR Mind
- "Beautiful Mind",等效于Beautiful And Mind,Phrase查询,还要求前后顺序保持一致。
- 分组和引号
- title:(Beautiful OR Mind)
- title="Beautiful Mind"
3.3 Query String Syntax Part2
- 布尔操作
- AND /OR/NOT 或者 && / || /!
- 必须大写
- title:(A NOT B)
- AND /OR/NOT 或者 && / || /!
- 分组
-
+
表示must -
-
表示must not - title:(+matrix -reload)
-
GET /movies/_search?q=title:(Beautiful NOT Mind)
GET /movies/_search?q=title:(Beautiful %2B Mind) #加号需要转义
3.4 Query String Syntax Part3
- 范围查询
- 区间表示:[]闭区间,{}开区间
- year:{2015 TO 2018} ,year:[* TO 2018]
- 算数符号
- year:>2010
- year:(>2010 && <=2018)
- year:(+>2010 +<2018)
3.5 Query String Syntax Part4
- 通配符查询(效率低)
?
代表一个字符,*
代表0或者多个字符。title:mi?d - 正则表达式
title:[bt]oy - 模糊匹配与近似查询
- title:beautiful~1(用户输入单词有一个字母输错可以兼容)
- title:"lord rings"~2(要求lord和rings之间可以间隔两个单词),比如可以搜索出(Lord of the Rings)
4. Request Body
将请求的参数放在body里面,一些高阶的方法只支持Request body。
- _source filtering
- 如果source没有存储,只返回匹配的文档的元数据。
- _source支持使用通配符, _source:["name","desc"]
- sort 排序。 (sort:{"id":"desc"})
- 脚本字段
- 例如,结合汇率对订单进行排序
- 字段拼接
GET /movies/_search
{
"from":10,
"size":20,
"script_fields": {
"new_field":{
"script":{
"lang":"painless",
"source": "doc['year'].value+'_hello'"
}
}
},
"query":{
"match_all": {}
}
}
POST /movies/_search
{
"from":10,
"size":20,
"_source": ["title","year"],
"query":{
"match_all": {}
}
}
{
"took" : 0,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 9754,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "movies",
"_type" : "_doc",
"_id" : "LHHdfG4BIAugzu8i1C-n",
"_score" : 1.0,
"fields" : {
"new_field" : [
"1993_hello"
]
}
}
]
}
}
4.1 Match 查询表达式
实现效果,参看前面的查询语法逻辑运算.
案例
GET /movies/_search
{
"query":{
"match":{
"title":"Beautiful Mind"
}
}
}
查询title字段包含 Beautiful 或者 Mind
GET /movies/_search
{
"query":{
"match":{
"title":{
"query": "Beautiful Mind",
"operator": "AND"
}
}
}
}
查询title字段包含 Beautiful和Mind,且要求顺序。
4.2 match_phrase,短语查询
GET /movies/_search
{
"query":{
"match_phrase":{
"title":{
"query": "lord rings",
"slop": 2
}
}
}
}
短语查询,中间允许隔开两个单词
4.3 query string
类似与URI Query
格式案例
POST users/_search
{
"query": {
"query_string": {
"default_field": "user_name",
"query": "张三"
}
}
}
查询user_name字段包含张三的。
POST users/_search
{
"query": {
"query_string": {
"fields": ["user_name","account"],
"query": "张 AND 三"
}
}
}
user_name或者account包含张三的
4.4 simple query string
- 类似Query String,但是会忽视错误的语法,只支持部分查询语法。
- 不支持 AND OR NOT,会当字符串处理
- Term之间默认是OR,可以通过default_operator字段指定。
- 支持部分逻辑
-
+
替代 AND -
|
替代OR -
-
替代NOT
-
POST users/_search
{
"query": {
"simple_query_string": {
"fields": ["user_name","account"],
"query": "wang wei",
"default_operator": "OR"
}
}
}