2.4 matchQuery 查询条件进行分词or或and进行查询
match查询:
•会对查询条件进行分词。
•然后将分词后的查询条件和词条进行等值匹配
默认取并集(OR)
# match查询 GET goods/_search { "query": { "match": { "title": "华为手机" } }, "size": 500 }
match 的默认搜索(or 并集)
例如:华为手机,会分词为 “华为”,“手机” 只要出现其中一个词条都会搜索到
match的 and(交集) 搜索
例如:例如:华为手机,会分词为 “华为”,“手机” 但要求“华为”,和“手机”同时出现在词条中
总结:
- term query会去倒排索引中寻找确切的term,它并不知道分词器的存在。这种查询适合keyword 、numeric、date
- match query知道分词器的存在。并且理解是如何被分词的
2.5 模糊查询-脚本
2.5.1 wildcard查询
wildcard查询:会对查询条件进行分词。还可以使用通配符 ?(任意单个字符) 和 * (0个或多个字符)
"*华*" 包含华字的 "华*" 华字后边多个字符 "华?" 华字后边多个字符 "*华"或"?华" 会引发全表(全索引)扫描 注意效率问题
# wildcard 查询。查询条件分词,模糊查询 GET goods/_search { "query": { "wildcard": { "title": { "value": "华*" } } } }
2.5.2正则查询
\W:匹配包括下划线的任何单词字符,等价于 [A-Z a-z 0-9_] 开头的反斜杠是转义符 +号多次出现 (.)*为任意字符 正则查询取决于正则表达式的效率
GET goods/_search { "query": { "regexp": { "title": "\\w+(.)*" } } }
2.5.3前缀查询
对keyword类型支持比较好
# 前缀查询 对keyword类型支持比较好 GET goods/_search { "query": { "prefix": { "brandName": { "value": "三" } } } }
2.6 模糊查询-JavaAPI
//模糊查询 WildcardQueryBuilder query = QueryBuilders.wildcardQuery("title", "华*");//华后多个字符 //正则查询 RegexpQueryBuilder query = QueryBuilders.regexpQuery("title", "\\w+(.)*"); //前缀查询 PrefixQueryBuilder query = QueryBuilders.prefixQuery("brandName", "三");
2.7 范围&排序查询
# 范围查询 GET goods/_search { "query": { "range": { "price": { "gte": 2000, "lte": 3000 } } }, "sort": [ { "price": { "order": "desc" } } ] }
//范围查询 以price 价格为条件 RangeQueryBuilder query = QueryBuilders.rangeQuery("price"); //指定下限 query.gte(2000); //指定上限 query.lte(3000); sourceBuilder.query(query); //排序 价格 降序排列 sourceBuilder.sort("price",SortOrder.DESC);
2.8 queryString查询-多个字段取并集查询
queryString 多条件查询
•会对查询条件进行分词。
•然后将分词后的查询条件和词条进行等值匹配
•默认取并集(OR)
•可以指定多个查询字段
query_string:识别query中的连接符(or 、and)
# queryString GET goods/_search { "query": { "query_string": { "fields": ["title","categoryName","brandName"], "query": "华为 AND 手机" } } }
simple_query_string:不识别query中的连接符(or 、and),查询时会将 “华为”、“and”、“手机”分别进行查询
GET goods/_search { "query": { "simple_query_string": { "fields": ["title","categoryName","brandName"], "query": "华为 AND 手机" } } }
query_string:有default_operator连接符的脚本
GET goods/_search { "query": { "query_string": { "fields": ["title","brandName","categoryName"], "query": "华为手机 " , "default_operator": "AND" } } }
java代码
QueryStringQueryBuilder query = QueryBuilders.queryStringQuery("华为手机").field("title").field("categoryName") .field("brandName").defaultOperator(Operator.AND);
simple_query_string:有default_operator连接符的脚本
GET goods/_search { "query": { "simple_query_string": { "fields": ["title","brandName","categoryName"], "query": "华为手机 " , "default_operator": "OR" } } }
注意:query中的or and 是查询时 匹配条件是否同时出现----or 出现一个即可,and 两个条件同时出现
default_operator的or and 是对结果进行 并集(or)、交集(and)
2.9 布尔查询-脚本
boolQuery:对多个查询条件连接。连接方式:
•must(and):条件必须成立
•must_not(not):条件必须不成立
•should(or):条件可以成立
•filter:条件必须成立,性能比must高。不会计算得分
**得分:**即条件匹配度,匹配度越高,得分越高
# boolquery #must和filter配合使用时,max_score(得分)是显示的 #must 默认数组形式 GET goods/_search { "query": { "bool": { "must": [ { "term": { "brandName": { "value": "华为" } } } ], "filter":[ { "term": { "title": "手机" } }, { "range":{ "price": { "gte": 2000, "lte": 3000 } } } ] } } } #filter 单独使用 filter可以是单个条件,也可多个条件(数组形式) GET goods/_search { "query": { "bool": { "filter": [ { "term": { "brandName": { "value": "华为" } } } ] } } }