ElasticSearch 实现分词全文检索 - 经纬度定位商家距离查询

elasticsearch,实现,分词,全文检索,经纬度,定位,商家,距离,查询 · 浏览次数 : 163

小编点评

**ElasticSearch 实现分词全文检索** **概述** ElasticSearch 是一个开源搜索引擎,它可以用于构建一个可扩展的搜索索引。ElasticSearch 提供分词功能,允许您在搜索中使用多个词语进行搜索。 **安装** 您可以使用以下命令安装 Elasticsearch: ``` curl -O elasticsearch-setup.zip - | sudo -E unzip -d /usr/local/bin ``` **配置** 您可以使用以下命令配置 Elasticsearch: ``` elasticsearch -e ``` **RESTful 基本操作** 您可以使用以下 RESTful API 进行分词搜索: * `POST /map/_search`:用于搜索按地理位置的地理距离搜索结果。 * `GET /map/_search`:用于搜索所有地理距离搜索结果。 * `GET /map/_doc/id`:用于获取指定 ID 的文档。 * `POST /map/_doc/id`:用于添加或更新文档。 **Java SpringBoot ES 索引操作** 您可以使用 Spring Boot 的 ES 客户端进行分词搜索: ```java @Autowired private ElasticsearchClient esClient; public void indexDocument(String indexName, String document) { IndexRequest request = IndexRequest.index(indexName); request.source(document); esClient.index(request); } ``` **Java SpringBoot ES 文档操作** 您可以使用 Spring Boot 的 ES 客户端进行分词搜索: ```java @Autowired private ElasticsearchClient esClient; public void searchDocuments(String indexName, String query) { SearchRequest request = SearchRequest.search(indexName); request.query(QueryBuilders.matchQuery(query)); SearchResult results = esClient.search(request); // 处理结果 } ``` **测试数据准备** 您可以使用以下方法创建一个包含多个地理位置的文档: ```java public void createIndex() { IndexRequest request = IndexRequest.index("map"); request.settings.put("number_of_shards", 2); request.settings.put("number_of_replicas", 1); request.addMapping(Mapping.of("properties", Mapping.of("name", Mapping.of("type", "text")))); esClient.index(request); } ``` **分词搜索** 您可以使用以下方法搜索包含多个词语的文档: ```java public void searchQuery() { SearchRequest request = SearchRequest.search("map"); request.query(QueryBuilders.matchQuery("location", new GeoPoint(40.013315, 116.31027))); SearchResult results = esClient.search(request); // 处理结果 } ``` **总结** ElasticSearch 实现分词全文检索,允许您在搜索中使用多个词语进行搜索。您可以使用 RESTful API 或 Java SpringBoot ES 客户端进行分词搜索。

正文

目录

ElasticSearch 实现分词全文检索 - 概述
ElasticSearch 实现分词全文检索 - ES、Kibana、IK安装
ElasticSearch 实现分词全文检索 - Restful基本操作
ElasticSearch 实现分词全文检索 - Java SpringBoot ES 索引操作
ElasticSearch 实现分词全文检索 - Java SpringBoot ES 文档操作
ElasticSearch 实现分词全文检索 - 测试数据准备
ElasticSearch 实现分词全文检索 - term、terms查询
ElasticSearch 实现分词全文检索 - match、match_all、multimatch查询
ElasticSearch 实现分词全文检索 - id、ids、prefix、fuzzy、wildcard、range、regexp 查询
ElasticSearch 实现分词全文检索 - Scroll 深分页
ElasticSearch 实现分词全文检索 - delete-by-query
ElasticSearch 实现分词全文检索 - 复合查询
ElasticSearch 实现分词全文检索 - filter查询
ElasticSearch 实现分词全文检索 - 高亮查询
ElasticSearch 实现分词全文检索 - 聚合查询 cardinality
ElasticSearch 实现分词全文检索 - 经纬度查询
ElasticSearch 实现分词全文检索 - 搜素关键字自动补全(suggest)
ElasticSearch 实现分词全文检索 - SpringBoot 完整实现 Demo 附源码

地图经纬度搜索

ES 中提供了一个数据类型 geo_point, 用来存储经纬度

创建ES索引

# 创建一个索引,指定 name,location
PUT /map
{
  "settings": {
    "number_of_shards": 2,
    "number_of_replicas": 1
  },
  "mappings": { 
    "properties":{
      "name":{
        "type":"text"
      },
      "location":{
        "type":"geo_point"
      }
    } 
  }
}

百度地图经纬度:http://api.map.baidu.com/lbsapi/getpoint/index.html

添加数据

# 添加数据
PUT /map/_doc/1
{
  "name":"天安门",
  "location":{
    "lon":116.403119,
    "lat":39.915599
  }
}

PUT /map/_doc/2
{
  "name":"北京大学",
  "location":{
    "lon":116.316486,
    "lat":39.999416
  }
}

PUT /map/_doc/3
{
  "name":"清华大学",
  "location":{
    "lon":116.333267,
    "lat":40.010276
  }
}

ES地图搜索方式

  • geo_distance: 直线距离检索方式
    image
  • geo_bound_box:以两个点确定一个巨型,获取在矩形内的全部数据
    image
  • geo_polygon:以多个点,确定一个多边形,获取多边形内的全部数据
    image

实现地图检索

# 直接距离
POST /map/_search
{ 
  "query":{
    "geo_distance":{
      "location":{     #确定一个点
        "lon":116.433589,
        "lat":39.909235
      },
      "distance":3000,  # 2000 查不到,当前定位中,3公里内维护的数据(类似外卖)
      "distance_type":"arc"   # 指定形状为圆形,直接距离
    }
  }
}

# 左上、右下,确定巨型范围
POST /map/_search
{ 
  "query":{
    "geo_bounding_box":{
      "location":{
        "top_left":{       # 圆明园
          "lon":116.309695,
          "lat":40.013094
        },
        "bottom_right":{    # 天安门
          "lon":116.403119,
          "lat":39.915599
        }
      }
    }
  }
}

# 多点确定范围
POST /map/_search
{
  "query":{
    "geo_polygon":{
      "location":{
        "points":[
          { 
            "lon":116.31027,
            "lat":40.013315
          },
          { 
            "lon":116.335854,
            "lat":39.998282
          },{ 
            "lon":116.301359,
            "lat":39.992534
          }
        ]
      }
    }
  }
}

Java

@Test
void geoPolygon() throws Exception {
    String indexName = "map";
    RestHighLevelClient client = ESClient.getClient();

    //1. 创建SearchRequest对象
    SearchRequest request = new SearchRequest(indexName);

    //2. 指定查询条件
    List<GeoPoint> points = new ArrayList<>();
    points.add(new GeoPoint(40.013315, 116.31027));
    points.add(new GeoPoint( 39.998282,116.335854));
    points.add(new GeoPoint( 39.992534,116.301359));

    SearchSourceBuilder builder = new SearchSourceBuilder();
    builder.query(QueryBuilders.geoPolygonQuery("location", points));
    request.source(builder);

    //3. 执行查询
    SearchResponse resp = client.search(request, RequestOptions.DEFAULT);

    //4. 输出返回值
    for (SearchHit hit : resp.getHits().getHits()) {
        System.out.println(hit.getSourceAsMap());
    }
}

与ElasticSearch 实现分词全文检索 - 经纬度定位商家距离查询相似的内容:

ElasticSearch 实现分词全文检索 - 经纬度定位商家距离查询

目录 ElasticSearch 实现分词全文检索 - 概述 ElasticSearch 实现分词全文检索 - ES、Kibana、IK安装 ElasticSearch 实现分词全文检索 - Restful基本操作 ElasticSearch 实现分词全文检索 - Java SpringBoot E

ElasticSearch 实现分词全文检索 - filter查询

query,根据查询条件,去计算文档的匹配度得到一个分数,并且根据分数进行排序,不会做缓存。【精准匹配度高】 filter,根据查询条件去查询文档,不去计算分数,而且filter会对经常被过滤的数据进行缓存。【查询效率会高】

ElasticSearch 实现分词全文检索 - 概述

ES 是一个使用Java语言并且基于Lucene编写的搜索引擎框架,他提供了分布式的全文搜索功能,提供了一个统一的基于Restful风格的WEB接口,官方客户端也对多种语言都提供了相应的API。

ElasticSearch 实现分词全文检索 - ES、Kibana、IK分词器安装

先把zip下载下来。放到任意一台服务器(直接github上下载多数会失败)elasticsearch-plugin install http://172.16.0.183:8899/Java/elasticsearch-analysis-ik-7.9.3.zip

ElasticSearch 实现分词全文检索 - Restful基本操作

GET 请求: ``` http://ip:port/index: 查询索引信息 http://ip;port/index/type/doc_id: 查询指定的文档信息 ``` POST 请求: ``` http://ip;port/index/type/_search: 查询文档,可以在请求体中添加json字符串来代表查询条件 http://ip;port/index/type/doc_id/

ElasticSearch 实现分词全文检索 - Java SpringBoot ES 索引操作

//1. 准备索引的 settings Settings.Builder settings = Settings.builder() //2. 准备索引的结构 Mappings XContentBuilder mappings = JsonXContent.contentBuilder() //3. 将 Settings 和 Mappings 封装到一个Request 对象中

ElasticSearch 实现分词全文检索 - Java SpringBoot ES 文档操作

//准备一个Request对象 IndexRequest request = new IndexRequest(indexName); request.id(person.getId().toString()); //手动指定ID request.source(personJson, XContentType.JSON); //通过 Client 对象执行

ElasticSearch 实现分词全文检索 - 测试数据准备

String json = JSON.toJSONStringWithDateFormat(sms, "yyyy-MM-dd HH:mm:ss"); FastJson 将日期格式化 BulkRequest bulkRequest = new BulkRequest(); Integer idx = 1; for (String json : jsonList) {

ElasticSearch 实现分词全文检索 - term、terms查询

term 查询 term的查询是代表完全匹配,搜索之前不会对你搜索的关键字进行分词,对你的关键字去文档分词库中的去匹配内容 terms和term的查询机制是一样,都不会将指定的查询关键字进行分词,直接去分词库中匹配,找到相应文档内容。 terms是在针对一个字段包含多个值的时候使用。 term: where province = 江苏 terms: where province = 江苏 or p

ElasticSearch 实现分词全文检索 - match、match_all、multimatch查询

match查询属于高层查询,他会根据你查询的字段类型不一样,采用不同的查询方式。 - 查询的是日期或者是数值的话,他会将你基于的字符串查询内容转换为日期或者数值对待。 - 如果查询的内容是一个不能被分词的内容 (keyword) ,match查询不会对你指定的查询关键字进行分词。 - 如果查询的内容时一个可以被分词的内容 (text),match会将你指定的查询内容根据一定的方式去分词,去分词库中