Elasticsearch 相关资料收集

先留个坑,详细内容后续补;

书籍:

elasticSearch在线权威指南中文版

 

社区:

elasticsearch中文社区

 

 

需下载的工具:

1.elasticsearch:

windows下ElasticSearch 安装

linux下elasticSearch安装

 

2.curl:

windows下curl安装

linux下curl安装

 

3.kibana:

windows下的kibana安装

linux下kibana安装

 

4.sense:

在 kibana5.x版本以后,sense都默认集成到kibana中,不需要手动安装(安装也安装不成功),错误参考stackoverflow一篇:https://stackoverflow.com/questions/40635566/cant-install-sense-plugin-for-kibana

如果你使用的是低于kibana5.x的版本,那么参考该文章:Windows下为Kibana安装sense插件

 

-----------------------

在es 6.X之后, 1个index中只能映射一个type.否则会报错

Rejecting mapping update to [website] as the final mapping would have more than 1 type: [log, blog]

详情见:https://elasticsearch.cn/question/4472

 

5.elasticSearch-head插件

ES6.0版本安装head插件

------------------

搜索的语法:

空搜索:GET /_search?timeout=10ms   得出所有_index 所有_type中的文档信息

限制搜索_index或者_type,如果有多个需使用,隔开 , 地址的顺序为:/_index/_type/id........

/gb/_search在 gb 索引中搜索所有的类型

/gb,us/_search在 gb 和 us 索引中搜索所有的文档

/g*,u*/_search在任何以 g 或者 u 开头的索引中搜索所有的类型

/gb/user/_search在 gb 索引中搜索 user 类型

/gb,us/user,tweet/_search在 gb 和 us 索引中搜索 user 和 tweet 类型

/_all/user,tweet/_search在所有的索引中搜索 user 和 tweet 类型

 

 

-------------

搜索分页:

和 SQL 使用 LIMIT 关键字返回单个 page 结果的方法相同,Elasticsearch 接受 from 和 size 参数:

size显示应该返回的结果数量,默认是 10from显示应该跳过的初始结果数量,默认是 0

如果每页展示 5 条结果,可以用下面方式请求得到 1 到 3 页的结果: 

GET /_search?size=5
GET /_search?size=5&from=5
GET /_search?size=5&from=10

 

------------------

搜索API分类:

1.“轻量的” 查询字符串

2. 使用json请求体

 

查询字符串:

例如,查询在 tweet 类型中 tweet 字段包含 elasticsearch 单词的所有文档:

GET /_all/tweet/_search?q=tweet:elasticsearch

如果查询条件中有多个字段,则需要使用空格分割:

GET /_all/tweet/_search?q=tweet:elasticsearch name:john

可以对字段使用+ 或 - 修饰:

  + 前缀表示必须与查询条件匹配

  - 前缀表示一定不与查询条件匹配

  没有 + 或者 - 的所有其他条件都是可选的

GET /_search?q=+name:mary

 

_all字段:

如果在查询条件中没有明确指定查询字段名称,则默认是搜索_all字段

而_all字段的值就是该文档中其他字段的值组合拼成的大字符串,例如:

{
    "tweet":    "However did I manage before Elasticsearch?",
    "date":     "2014-09-14",
    "name":     "Mary Jones",
    "user_id":  1
}

此时_all 的字段的值为:

"However did I manage before Elasticsearch? 2014-09-14 Mary Jones 1"

多字段复杂的查询组合

GET /us/tweet/_search?q=+name:(mary john) +date:>2014-09-10 +(aggregations geo)

上句语句的查询条件是:

  • name 字段中包含 mary 或者 john
  • date 值大于 2014-09-10
  • _all_ 字段包含 aggregations 或者 geo

 

查询字符做了编码后,可读性会变得很差:

查询字符串在做了适当的编码后,可读性很差:

轻量字符串查询优缺点分析:

优点:

  1.可以很方便即席查询

  2.查询语法简洁

缺点:

  1.一些查询字符串中很小的语法错误,像 - , : , / 或者 " 不匹配等,将会返回错误而不是搜索结果。 

  2.编码后可读性差

  3.查询字符串搜索允许任何用户在索引的任意字段上执行可能较慢且重量级的查询,这可能会暴露隐私信息,甚至将集群拖垮。

官方建议:不推荐直接向用户暴露查询字符串搜索功能,除非对于集群和数据来说非常信任他们。所以生产中还是使用request body查询为主,不仅可以达到相同功能,还具有额外的功能!

 

elasticsearch中的数据分为两类: 精确 / 全文,  

精确包括日期(date类型)或用户ID(long 类型) , 搜索要么匹配要么不匹配, 而全文一般指文本数据(text类型)

  • 当你查询一个 全文 域时, 会对查询字符串应用相同的分析器,以产生正确的搜索词条列表。
  • 当你查询一个 精确值 域时,不会分析查询字符串, 而是搜索你指定的精确值。

 

 

 请求体查询:

单一查询:

GET /_search
{
    "query": {
        "match": {
            "tweet": "elasticsearch"
        }
    }
}

组合查询:

GET /_search
{
    "query": {
        "bool": {
            "must": {
                "match": {"tweet": "elasticsearch"}
            },
            "must_not": {
                "match": {"name": "2"}
            },
            "should": {
                "match": {"tweet": "full text"}
            },
            "filter": {
                "range": {
                    "age": {"gt": 30}
                }
            }
        }
    }
}

使用bool语句组合其他条件的查询,bool可以包含的关键字有

  must    :必需包含

  must_not  :必需不包含  

  should    :包含会增加匹配度,增加_score的分值(加分),不包含也无所谓

  filter     :过滤掉不满足条件的数据

 

 

 

 

 

 

 

 

官方建议:不推荐直接向用户暴露查询字符串搜索功能,除非对于集群和数据来说非常信任他们。所以生产中还是使用request body查询为主,不仅可以达到相同功能,还具有额外的功能!

  

 






    

posted @ 2018-08-21 10:56  yi杆烟枪  阅读(160)  评论(0编辑  收藏  举报