0
点赞
收藏
分享

微信扫一扫

Elasticsearch问题及解决

孟佳 2022-03-12 阅读 61

1.类型问题

直接创建索引时,会默认将类型设置为_doc。

也可以使用下方put来进行类型的指定,然后再将这条文档删除,嘿嘿。不就实现了一个空的且制定类型的索引

PUT /索引名/类型名(之后可以没有 直接用_doc代替)/文档id
{
    请求体
}

2.文档中字段类型

es默认会根据插入的数据来自动指定类型大多数为:

"name": {
    "type": "text",
        "fields": {
            "keyword": {
                "type": "keyword",
                "ignore_above": 256
            }
        }
}

实际上是创建了两种类型的。text和keyword。需要使用keyword时,就需要使用name.keyword。

当然也可以在创建索引的时候直接定义类型。

PUT /lala
{
    "mappings":{
        "properties":{
            "name":{
                "type":"text"
            },
            "age":{
                "type":"long"
            },
            "birthday":{
                "type":"date"
            }
        }
    }
}

text类型

1:支持分词,全文检索,支持模糊、精确查询,不支持聚合,排序操作;
2:test类型的最大支持的字符长度无限制,适合大字段存储;
使用场景:
    存储全文搜索数据, 例如: 邮箱内容、地址、代码块、博客文章内容等。
    默认结合standard analyzer(标准解析器)对文本进行分词、倒排索引。
    默认结合标准分析器进行词命中、词频相关度打分。

keyword

1:不进行分词,直接索引,支持模糊、支持精确匹配,支持聚合、排序操作。
2:keyword类型的最大支持的长度为——32766个UTF-8类型的字符,可以通过设置ignore_above指定自持字符长度,超过给定长度后的数据将不被索引,无法通过term精确匹配检索返回结果。
​
使用场景:
存储邮箱号码、url、name、title,手机号码、主机名、状态码、邮政编码、标签、年龄、性别等数据。
用于筛选数据(例如: select * from x where status='open')、排序、聚合(统计)。
直接将完整的文本保存到倒排索引中。
​
也就是并不会将"我是中国人"这个字段分割为"我","是","我是","中国"....
而是直接将"我是中国人"这个字段进行保存到倒排索引中。

常见问题

当使用API进行查询时,使用text和keyword两种类型分别进行同一种查询时,得到的结果也不相同。

//name中的数据为 "我是中国人时"
​
//这里的wildcardQuery支持通配符
BoolQueryBuilder builder = QueryBuilders.boolQuery();
builder.must(QueryBuilders.wildcardQuery("name.keyword","*我是*"));
​
builder.must(QueryBuilders.wildcardQuery("name","*我是*"));

例如上方的模糊查找。具体方法见目录中的API使用。

builder.must(QueryBuilders.wildcardQuery("name","*我是*"));
当只是用name时,进行模糊查询时,当进行以上查询,并不会查询到数据。
​
当修改为:
builder.must(QueryBuilders.wildcardQuery("name","*是*"));
​
便能查询到数据。因为直接使用name便会默认使用text类型。
    将数据ik_max_word进行最大分词。因此只能获得一个字儿的多个数据。所以只有一个字儿时进行查询能获得数据。

而使用.keyword时:

builder.must(QueryBuilders.wildcardQuery("name.keyword","*我是*"));
不论通配符中放置多少个数据时,都会查询到对应的数据。
因为keword并不会将数据进行分词。
   始终都是使用完整的数据和我们查询的部分字段进行匹配。

别的方法中也同时存在text和keyword的问题,记得注意哦!

3.端口问题

我们会发现在ElasticSearch启动时,会占用两个端口9200和9300。 他们具体的作用如下:

9200 是ES节点与外部通讯使用的端口。它是http协议的RESTful接口

通过9200端口,elasticsearch本身是可以通过http协议来访问的,自带restful风格的访问方式,其它语言以及直接测试访问都是通过9200端口

9300是ES节点之间通讯使用的端口。它是tcp通讯端口,集群间和TCPclient都走的它。

通过9300端口,9300端口开放给java api来访问调用,只开放给java通过特定的client来访问

总结,目前在java项目中集成elasticsearch使用9300,其它情况都用9200

4.分页问题

解决from size只能返回10000条数据。

PUT _all/_settings 
{"max_result_window":"1000000000"}

当然如果是大数据量的话,使用以上的方法会使得es索引库检索速度变慢。

设置的最大值只能是1000000000。否则会报错。

举报

相关推荐

0 条评论