ES的基本语法
搜索的本质及原理
ES是什么
- 独立的网络上的一个或一组节点
- 对外提供搜索服务
- 对内就是一个关系型数据库
名字定义
关系型数据库 | ES |
---|---|
DATABASE | INDEX |
Table | Type |
Row(行) | Document |
Filed(列) | Colum |
index | Update TABLE SET |
SELECT * from TABLE*** | SELECT * from TABLE*** |
Update TABLE SET | Update TABLE SET |
分词定义
- 搜索是以词为单位做最基本的搜索单元
- 依靠分词器构建分词
- 用分词构建倒排索引
- 最后用搜索时候去搜索对应分词器分出的token和索引中存储分词找到我们想要的文档
倒排索引定义
正向索引:从文档到词
倒排索引:先从词到文档
TF-IDF 打分
含义:判断匹配度高低
- TF:词频 这个document 包含了多少个这个词,包含越多表示越相关
- DF:文档频率 包含该词的文档总数目
- IDF:DF取反
分布式搜索引擎的原理
分片/主从/路由
主节点含义:管理所有负载的核心写操作
索引是yellow还是green,主要看从分片数量,如果从分片数量是3,而节点也是2,必须有一个从分片放在主分片节点,就是yellow
ES基础语法
match:会对词做分词
term:不会做分词
filter:里可以用match分词但是不会做score打分,score是0
带排序则里面score没用了是null
//使用结构化的方式创建索引
PUT /employee
{
"settings":{
"number_of_shards":1,
"number_of_replicas":1
},
"mappings": {
"properties":{
"name":{"type":"text"},
"age":{"type":"integer"}
}
}
}
//带排序则里面score没用了
GET /employee/_search
{
"query":{
"match": {"name":"兄长"}
},
"sort":[
{"age":{"order":"desc"}}
]
}
//带filter(等于where) match会分词,term不会分词 ,但是分数都为0
GET /employee/_search
{
"query":{
"bool": {
"filter":[
{"match":{"name":"兄11"}}
]
}
}
}
GET /employee/_search
{
"query":{
"bool": {
"filter":[
{"term":{"name":"兄11"}}
]
}
}
}
带聚合:
//带聚合,判断31岁有几个,30岁有几个
GET /employee/_search
{
"query":{
"match": {"name":"兄"}
},
"sort":[
{"age":{"order":"desc"}}
],
"aggs":{
"group_by_age":{
"terms": {
"field": "age"
}
}
}
}
分词
充分理解倒排索引及分词过程
analyze分词过程
- 标准分词
分词过程:字符过滤,字符处理(分词),分词过滤
例如: Eating an apple a day & keeps the doctor away
字符过滤 &过滤掉
字符处理,默认用标准分词器,以空格和标点符号分割
分词过滤,变小写
最后建立索引 eating an apple a day keeps the doctor away
2.英文分词
分词过程:字符过滤,字符处理(分词),分词过滤
例如: Eating an apple a day & keeps the doctor away
字符过滤 过滤掉特殊符号外加量词,an,the,with等等量词当作停用词无意义
字符处理,默认用标准分词器,以空格和标点符号分割
分词过滤,变小写并词干转化(就是把同意词和复数比如s去掉)
最后建立索引 eat an appl dai keep doctor awai
3.IK分词
分词过程:字符过滤,字符处理(分词),分词过滤
例如: 中华人民共和国
字符过滤 过滤掉特殊符号外加量词,的等等量词当作停用词无意义
字符处理,基于词库词典进行分词(中华 人民 共 和 国)
分词过滤,对英文要做词化转化
最后建立索引 中华 人民 共 和 国
//搜索match 按照字段上定义的分词分析后,去索引内查询
GET movie/_search
{
"query":{
"match":{"title":"steve"}
}
}
GET movie/_analyze
{
"field": "title",
"text": "steve zissou"
}
//搜索term 不会分词的分析,直接去索引内查询
GET movie/_search
{
"query":{
"term":{"title":"steve zissou"}
}
}
存储并索引
filed类型
- text: 被分析索引的字符串类型
- keyword:不能被分析只能被精确匹配的字符串类型
- date:日期类型,可以配合formate一起运行
- 数字类型:long,integer,short,double
- boolean类型
- array类型:{”one“,“two”}
- object类型:json嵌套{”property1“:“value1”,“property2”:“value2”}
- ip类型
- geo_point:地理位置:
TF/IDF打分
TF:词频 这个文档中包含了多少个这个词,包含越多表示越相关
DF:文档频率 包含该次的文档总数目
IDF: 文档取反
tfnorm:查询一个词在文档中次数,如果文档很长就比较小 即词频归一化
打分主要做排序,那如果用filter没有分数则自己加sort排序
best_fields:默认,取得分最高的作为对应的分数,最匹配模式,等同于dismax模式,这是以
most_fields:取命中的分值相加作为分数,同should match模式,加权共同影响模式,这是以字段为单位分别计算分词的分数,然后加在一起,适用于都有影响的匹配
GET /movie/_validate/query?explain
{
//"explain": true,
"query":{
"multi_match":{
"query":"steve job",
"fields":["title","overview"],
"operator": "or",
"type":"most_fields"
}
}
}
cross_fields:以分词为单位计算栏位总分
GET /movie/_validate/query?explain
{
//"explain": true,
"query":{
"multi_match":{
"query":"steve job",
"fields":["title","overview"],
"operator": "or",
"type":"cross_fields"
}
}
}