1、matchQuery和termQuery区别
matchQuery:会将搜索词分词,再与目标查询字段进行匹配,若分词中的任意一个词与目标字段匹配上,则可查询到。
matchPhrasePrefix:将搜索词分词,再与目标查询字段进行匹配,当全部分词匹配上,且位置与分词相同,则匹配上
termQuery:不会对搜索词进行分词处理,而是作为一个整体与目标字段进行匹配,若完全匹配,则可查询到。
wildcardQuery:模糊匹配, 是 term 级别的 query,支持通配符,如:QueryBuilders.wildcardQuery("content", "?全*"),其中?表示一个字符,*表示0个或多个字符
FuzzyQuery:模糊匹配 Term t = new Term("content", "work"); FuzzyQuery query = new FuzzyQuery(t, 0.1f, 1);第一个参数当然是词条对象,第二个参数
指的是levenshtein算法的最小相似度(默认的匹配度是0.5,当这个值越小时,通过模糊查找出的文档的匹配程度就越低,查出的文档量就越多,反之亦然),第三个
参数指的是要有多少个前缀字母完全匹配
例如:
GET /test_index/_search { "from": 0, "size": 100, "timeout": "60s", "query": { "bool": { "must": [{ "match_phrase_prefix": { "deviceUuidFristLogin": { "query": "XXXXXXXXXXXXXXXXXXXXX", "slop": 0, "max_expansions": 50, "boost": 1.0 } } }], "adjust_pure_negative": true, "boost": 1.0 } } }
2、must与should区别
must : 相当于 MySQL and
should : 相当于MySQL or (效率低)
3、如何查看一个字符串是如何分词的
GET /test_index/_analyze
{
"field": "deviceUuidFristLogin",
"text": "xxxxxxxxxxxxxxxxxxxxxxxxxxxx"
}
4、ElasticSearch 5.0以后,String字段被拆分成两种新的数据类型: text用于全文搜索,会分词,而keyword用于关键词搜索,不进行分词。对于字符串类型的字段,ES默认会再生成一个keyword字段用于精确索引。默认mapping如下:
"mapping": {
"properties": {
"id": {
"type": "long"
},
"searchField": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
5、fielddata
doc value 是在排序,分组等 需要文档映射到具体字段的一种正向索引,适用于很多类型字段,存储在磁盘上。
field data 是单指text 类型 也就是可以分词的类型的字段 在使用排序或分组等情况下 在内存中形成的一种正向索引,耗内存,一般默认不使用。
所以es查询在排序(sort)时的字段不推荐是text类型的;range范围查询时也不能使用text类型
另外es的聚合查询(max、min、avg、sum、terms/ranges--桶聚合等)也不能使用text类型字段
在ES5.x+里,一定要注意数值类型是否需要做范围查询,看似数值,但其实只用于Term或者Terms这类精确匹配的,应该定义为keyword类型,而不应该是long,例如userId,buyerId,sellerId
es分页常用解决方案:
方案一:由于es使用from、size最大能查不超过10000条记录,且一般后面的分页不会查看,所以可以限制最大分页数,比如限制最大100页
方案二:不限制最大页码,但是不允许跳页(像百度、google),只允许点下一页:这种可以使用search_after的方式,比如:
第一次查询,展示5条
GET /test_index/_search { "size": 2, "query": { "match" : { "sellerUserId": "xxxxx" } }, "sort": [ {"orderAddtime": "desc"}, {"_id": "desc"} ] }