基于数据库搜索:
站内搜索(垂直搜索):数据量小,简单搜索,可以使用数据库。问题出现:存储问题。电商网站商品上亿条时,涉及到单表数据过大必须拆分表,数据库磁盘占用过大必须分库(mycat )。性能问题:解决上面问题后,查询 “ 笔记本电脑 ” 等关键词时,上亿条数据的商品名字段逐行扫描,性能跟不上。不能分词。如搜索 “ 笔记本电脑 ” ,只能搜索完全和关键词一样的数据,那么数据量小时,搜索“ 笔记电脑 ” , “ 电脑 ”数据要不要给用户。
互联网搜索
数据量太大。PB 级。我们可以使用搜索引擎来解决数据库搜索的问题: 搜索也是数据库,搜索可以进行分词搜索,速度很快。
1 、 es 基本是开箱即用 ( 解压就可以用 !) , 非常简单。 Solr 安装略微复杂一丢丢!2 、 Solr 利用 Zookeeper 进行分布式管理 , 而Elasticsearch自身带有分布式协调管理功能 。3 、 Solr 支持更多格式的数据 , 比如 JSON 、 XML 、 CSV , 而Elasticsearch仅支持 json 文件格式。4 、 Solr 官方提供的功能更多 , 而 Elasticsearch 本身更注重于核心功能,高级功能多有第三方插件提供,例如图形化界面需要kibana 友好支撑5.Solr 查询快 , 但更新索引时慢 ( 即插入删除慢 ) ,用于电商等查询多的应用;ES 建立索引快 ( 即查询慢 ) ,即实时性查询快,用于 facebook 新浪等搜索。Solr 是传统搜索应用的有力解决方案,但 Elasticsearch 更适用于新兴的实时搜索应用。6 、 Solr 比较成熟,有一个更大,更成熟的用户、开发和贡献者社区,而Elasticsearch 相对开发维护者较少 , 更新太快 , 学习使用成本较高。

创建索引--数据库
有两种方式:
PUT /索引名称/类型名称/1 (创建索引并添加一条文档)

PUT /索引名称/类型(创建索引但不添加数据)

删除索引
DELETE /索引名

查询所有的索引
GET /_cat/indices?v

查看索引的结构
GET /索引名
添加文档--记录
两种添加方式
指定id的值(等同于修改,存在替换掉,不存在添加)
PUT /索引名/_doc(_doc:默认类型)/id值

不指定id
POST /索引名/_doc

查询文档--id查询
GET /索引名称/类型名称/id值

修改文档
指定所有的列修改,若只指定部分列,则其他的列消失
PUT /索引名/类型/id值


只修改部分列
POST /索引名/类型/id值/_update


删除文档
提交方式DELETE提交方式 根据不同的操作具有不同的提交方式restful风格
GET 查询
PUT 修改
POST 添加操作
DELETE 删除操作


查询所有的文档
GET /索引名/类型/_search

根据条件搜索
GET /索引名/类型/_search?q=字段名:字段值

把查询的数据封装成json数据
GET /索引名/类型/_search
{
"query":{
"match":{
"字段名":字段值
}
}
}

指定查询某些列
GET /索引名/类型/_search
{
"query":{
"match":{
"字段名":字段值
}
},
"_source":["字段名","字段名"]
}

分页查询
GET /索引名/类型/_search
{
"query":{
"match":{
"字段名":字段值
}
},
"_source":["字段名","字段名"]
"from":0,
"size":1
}

大于小于查询
gt : 大于 gte: 大于等于 lt: 小于 ,lte:小于等于
GET /索引名/类型/_search
{
"query":{
"range":{
"字段名":{
"gt":字段值
}
}
},
"_source":["字段名","字段名"],
"from":0,
"size":10
}

排序查询
asc 升序 desc 降序
GET /索引名/类型/_search
{
"query":{
"range":{
"字段名":{
"gt":字段值
}
}
},
"_source":["字段名","字段名"],
"from":0,
"size":10,
"sort":[
{
"字段名":{
"order":"asc"
}
}
]
}

且查询
select * from 表名 where 列=值 and 列=值........
must====等价于and
GET /索引名/类型/_search
{
"query":{
"bool":{
"must":[
{
"match":{
"字段名":"条件值"
}
},
{
"match":{
"字段名":条件值
}
}
]
}
}
}

或查询
select * from 表名 where 列=值 or 列=值........
should等价于or
GET /索引名/类型/_search
{
"query":{
"bool":{
"should":[
{
"match":{
"字段名":"条件值"
}
},
{
"match":{
"字段名":条件值
}
}
]
}
}
}

取反查询
select * from 表名 where 列!=18
must_not等价于!=
GET /索引名/类型/_search
{
"query":{
"bool":{
"must_not":[
{
"match":{
"字段名":"条件值"
}
}
]
}
}
}

高亮查询
GET /索引名/类型/_search
{
"query":{
"match":{
"字段名":"条件值"
}
},
"highlight":{
"pre_tags":"",
"post_tags":"",
"fields":{
"条件字段名":{}
}
}
}
返回给前端页面时,会显示高亮
