项目需要空间查询,百度了半天,看到了一个demo使用ElasticSearch实现空间查询。本想着复制过来草草完事,但是发现里面好多代码看都看不懂。干脆一不做二不休,那就学起来。
ElasticSearch 是基于Lucene做了封装和增强
当单纯的对已有数据进行搜索时,Solr速度较快
当实时建立索引时,Solr会产生io阻塞,性能较差,ElasticSearch 具有明显优势
随着数据量的增加,Solr的搜索效率会变低,ElasticSearch 没有明显变化
刚安装完就遇到了第一个问题,本机访问不了,折腾半天发现最新ElasticSearch 不支持Java1. 8,最后下载了7.6.1版本。
索引(indices) -> 数据库
字段类型(mapping)
文档(documents) -> 字段
倒排索引:将文档拆解成单词形成单词词典,查找数据只需匹配单词可以快速命中文档
ik分词器:
ik_smart:最少切分,不会重复出现单词
Ik_max_word:最细粒度划分,尽可能划分
Ik/config/**.xml可以自定义分词
Rest风格命令
method | url | 描述 |
PUT | localhost:9200/索引名称/类型名称/文档id | 创建文档(指定文档id) |
POST | localhost:9200/索引名称/类型名称 | 创建文档(随机文档id) |
POST | localhost:9200/索引名称/类型名称/文档id/_update | 修改文档 |
DELETE | localhost:9200/索引名称/类型名称/文档id | 删除文档 |
GET | localhost:9200/索引名称/类型名称/文档id | 根据文档id查询文档 |
POST | localhost:9200/索引名称/类型名称/_search | 查询所有数据 |
复杂搜索:
1.示例
GET user/_doc/_search
{
//搜索user索引中”name”包含”张”的文档
“query”: {
“match”: {
“name”: “张”
}
},
//过滤结果
“_source”: [“name”, “desc”],
//根据age降序排序
“sort”: [
{
“age”: {
“order”: “desc”
}
}
],
//分页查询(从第0条数据开始,返回10条数据)
“from”: 0,
“size”: 10
}
2.布尔查询(多条件查询)
//”must”相当于and,得到”name”含有”jack”并且”age”为10的文档
GET user/_doc/_search
{
“query”: {
“bool”: {
“must”: [
{
“match”: {
“name”: “jack”
}
},
{
“match”: {
“age”: 10
}
}
]
}
}
}
//”should”相当于or,得到”name”含有”jack”或者”age”为10的文档
GET user/_doc/_search
{
“query”: {
“bool”: {
“should”: [
{
“match”: {
“name”: “jack”
}
},
{
“match”: {
“age”: 10
}
}
]
}
}
}
//”must_not”相当于!=,得到”name”不含有”jack”并且”age”不为10的文档
GET user/_doc/_search
{
“query”: {
“bool”: {
“must_no”: [
{
“match”: {
“name”: “jack”
}
},
{
“match”: {
“age”: 10
}
}
]
}
}
}
//过滤查询,得到”name”含有”jack”并且”age”大于10的文档
GET user/_doc/_search
{
“query”: {
“bool”: {
“must”: [
{
“match”: {
“name”: “jack”
}
}
],
“filter”: {
“range”: {
“age”: {
“gt”: 10
}
}
}
}
}
}
match:匹配分词,将查询字段分词后的内容与文档中字段去比较
term:不匹配分词,直接拿查询字段去与文档中的字段去比较
(文档分词与否只根据文档字段的类型)
- 高亮查询
//得到”name”含有”jack”的文档,并且”name”中”jack”部分高亮为红色
GET user/_doc/_search
{
“query”: {
“match”: {
“name”: “jack”
}
},
“highlight”: {
“pre_tags”: “<p class=’key’ style=’color:red’>”
“post_tags”: “</p>”
“fields”: {
“name”: {}
}
}
}