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条

elasticSearch小结
GET /test_index/_search
{
    "size": 2,
    "query": {
        "match" : {
            "sellerUserId": "xxxxx"
        }
    },
    
    "sort": [
        {"orderAddtime": "desc"},
        {"_id": "desc"}
    ]

}
View Code

相关文章:

  • 2022-12-23
  • 2021-08-07
  • 2021-06-07
  • 2022-12-23
  • 2021-06-27
  • 2021-12-03
  • 2021-11-20
  • 2022-01-11
猜你喜欢
  • 2022-01-06
  • 2021-08-19
  • 2021-10-14
  • 2022-03-07
  • 2022-12-23
  • 2021-09-02
相关资源
相似解决方案