elasticsearch 地理查询的使用(二)

elasticsearch5.6.16与springboot的整合使用(主要是9300端口)

当前使用的elasticsearch版本是5.6.16版本springboot的版本主要是2.0.9.RELEASE稳定版,详细的maven依赖参考如下

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!--elasticsearch-->
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>transport</artifactId>
            <version>5.6.16</version>
        </dependency>
        <dependency>
            <groupId>org.locationtech.spatial4j</groupId>
            <artifactId>spatial4j</artifactId>
            <version>0.6</version>
        </dependency>
        <dependency>
            <groupId>com.vividsolutions</groupId>
            <artifactId>jts</artifactId>
            <version>1.13</version>
            <exclusions>
                <exclusion>
                    <groupId>xerces</groupId>
                    <artifactId>xercesImpl</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <!--devtools热部署-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <optional>true</optional>
            <scope>true</scope>
        </dependency>
    </dependencies>

写一个elasticsearch的配置类
@Configuration
public class ElasticSearchConfig {
    private static final Logger logger = LoggerFactory.getLogger(ElasticSearchConfig.class);

    @Value("${elasticsearch.ip}")
    private String hostName;

    @Value("${elasticsearch.port}")
    private String port;

    @Value("${elasticsearch.cluster.name}")
    private String clusterName;

    @Value("${elasticsearch.pool}")
    private String poolSize;

    @Bean
    public TransportClient transportClient()  {

        logger.info("Elasticsearch begin to init ");
        TransportClient transportClient = null;
        try {
            // 地址信息
            InetSocketTransportAddress transportAddress = new InetSocketTransportAddress(
                    InetAddress.getByName(hostName), Integer.valueOf(port));

            // 配置信息
            Settings esSetting = Settings.builder().put("cluster.name", clusterName) // 集群名字
                    .put("client.transport.sniff", true)// 增加嗅探机制,找到ES集群
                    .put("thread_pool.search.size", Integer.parseInt(poolSize))// 线程池个数
                    .put("client.transport.ping_timeout","120s")// 超时时间
                    .build();

            // 配置信息Settings自定义
            transportClient = new PreBuiltTransportClient(esSetting);
            transportClient.addTransportAddresses(transportAddress);
        } catch (Exception e) {
            logger.error("TransportClient create error", e);
        }
        return transportClient;
    }
}
连接elasticsearch的yml配置
# Elasticsearch
#9200端口是RESTFul API来访问ElasticSearch的端口,9300端口是es节点通讯的默认端口,给java程序用的配置9300
elasticsearch:
  ip: 127.0.0.1
  port: 9300
  pool: 5
  cluster:
        name: elasticsearch(在本机安转后访问localhost:9200端口查看cluster的名字)
简单一点的elasticsearch的操作(新增索引,索引一条数据,DSLQUery,聚合的简单操作)
@RestController
public class EsController {
    @Autowired
    private TransportClient transportClient;

    /**
     * 测试elasticsearch Get的查询
     * @param id
     * @return
     */
    @GetMapping("/customer/person/{id}")
    public Map<String, Object> getIndexById(@PathVariable("id") String id){
        // System.out.println("transportClient = " + transportClient);
        GetResponse response = transportClient.prepareGet("customer", "person", id).get();
        Map<String, Object> source = response.getSource();
        return source;
    }

    @GetMapping("/customer/person/add")
    public String add() throws IOException {
        User user=new User("zpj",18,"男","hunandaxue");
        XContentBuilder xContentBuilder= XContentFactory.jsonBuilder()
                .startObject()
                .field("name",user.getName())
                .field("age",user.getAge())
                .field("sex",user.getSex())
                .field("school",user.getSchool())
                .endObject();
        IndexResponse indexResponse = transportClient.prepareIndex("customer", "person").setSource(xContentBuilder).get();
        return "success";
    }
    @GetMapping("/customer/person")
    public String del(@RequestParam("id") String id){
        transportClient.prepareDelete("customer","person",id).get();

        return "success";
    }
    @GetMapping("/customer/person/update")
    public String update(@RequestParam("id2") String id2) throws ExecutionException, InterruptedException, IOException {
        System.out.println("id2 = " + id2);
        UpdateRequest updateRequest=new UpdateRequest("customer","person",id2);

        XContentBuilder xContentBuilder=XContentFactory.jsonBuilder()
                .startObject()
                .field("name","zpjyyyy")
                .endObject();
        updateRequest.doc(xContentBuilder);
        transportClient.update(updateRequest).get();
        return "success";
    }
    @GetMapping("/blank/search")
    public List<Object> query() throws ExecutionException, InterruptedException {
        // 构建query语句
        QueryBuilder queryBuilder=new MatchQueryBuilder("address","mill");
        // 构建agg聚合语句
        TermsAggregationBuilder ageAgg = AggregationBuilders.terms("ageAgg").field("age");
        AvgAggregationBuilder balanceAvg = AggregationBuilders.avg("balanceAvg").field("balance");
        ageAgg.subAggregation(balanceAvg);
        // 通过transportClient执行上述构建的语句
        SearchResponse searchResponse = transportClient.prepareSearch()
                .setQuery(queryBuilder)
                .addAggregation(ageAgg)
                // .addAggregation(balanceAvg)
                .execute().actionGet();
        List<Object> list=new ArrayList();
        // 获取到查询出来的数据Hitis为query语句查询出来的数据
        Iterator<SearchHit> iterator = searchResponse.getHits().iterator();
        // 使用迭代器进行遍历
        while (iterator.hasNext()){
            // 拿出每一个数据
            SearchHit next = iterator.next();
            // 存到准备好的list集合中
            list.add(next.getSource());
        }
        // 获取到agg语句查询出来的部分
        Terms ageAggTerms = (Terms) searchResponse.getAggregations().asMap().get("ageAgg");
        Iterator<? extends Terms.Bucket> iteratorAge = ageAggTerms.getBuckets().iterator();
        while (iteratorAge.hasNext()){
            Terms.Bucket next = iteratorAge.next();
            InternalAvg internalAvg = (InternalAvg) next.getAggregations().asMap().get("balanceAvg");
            list.add(internalAvg.getName()+" : "+internalAvg.getValue());
        }
        return list;
    }
}
使用elasticsearch进行地理查询的复杂操作(DLSQuery,聚合,地理查询函数的使用)

主要使用的geo_point类型的数据

@RestController
public class CityController {

    @Autowired
    private TransportClient transportClient;
    @GetMapping("/useGeoDistance")
    public List<Object> UseGeoDistance(){
        GeoPoint geoPoint=new GeoPoint();
        geoPoint.reset(24.46667, 118.10000);
        // 构造一个distance距离聚合查询在离厦门300km-800km的城市个数
        GeoDistanceAggregationBuilder geoAgg=AggregationBuilders.geoDistance("distanceAgg", geoPoint)
                .field("location")
                .unit(DistanceUnit.KILOMETERS)
                .addRange(300.00,800.00);
        GeoDistanceSortBuilder sort = SortBuilders.geoDistanceSort("location", 24.46667, 118.10000)
                .order(SortOrder.DESC);// 按照距离location点距离进行倒序排序
        QueryBuilder qbFilter = geoDistanceQuery("location") // 点的名字
                .point(24.46667, 118.10000)// 点的位置
                .distance(800, DistanceUnit.KILOMETERS);// 距离当前点的距离
        QueryBuilder boolQuery=new BoolQueryBuilder()
                .must(new MatchAllQueryBuilder())// 添加必须满足匹配全部被
                .filter(qbFilter);// 添加filter部分语句
        SearchResponse searchResponse = transportClient.prepareSearch()
                .setQuery(boolQuery)
                .addSort(sort)
                .addAggregation(geoAgg)
                .get();// 发送search请求并获取返回的数据
        List<Object> list=new ArrayList<>();
        Iterator<SearchHit> iterator = searchResponse.getHits().iterator();
        while (iterator.hasNext()){
            SearchHit next = iterator.next();
            Map<String, Object> source = next.getSource();
            list.add(source);

        }
        Aggregation distanceAgg = searchResponse.getAggregations().get("distanceAgg");
       // Map<String, Object> metaData = distanceAgg.getMetaData();
        list.add(distanceAgg);
        return list;

    }


}

后续是geo_shape的操作

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Java使用Elasticsearch查询向量数据,你需要使用ElasticsearchJava客户端库来与Elasticsearch集群进行交互。以下是一个简单的示例代码,演示了如何使用Java客户端进行向量数据查询: 首先,确保你已经安装了Elasticsearch,并在Java项目中添加了Elasticsearch Java客户端的依赖。 ```java import org.elasticsearch.action.search.SearchRequest; import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.client.RequestOptions; import org.elasticsearch.client.RestClient; import org.elasticsearch.client.RestHighLevelClient; import org.elasticsearch.common.unit.DistanceUnit; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.index.query.functionscore.ScoreFunctionBuilders; import org.elasticsearch.index.query.functionscore.ScriptScoreFunctionBuilder; import org.elasticsearch.script.Script; import org.elasticsearch.script.ScriptType; import org.elasticsearch.search.builder.SearchSourceBuilder; import java.io.IOException; public class ElasticsearchVectorQueryExample { public static void main(String[] args) { // 创建一个RestHighLevelClient实例 RestHighLevelClient client = new RestHighLevelClient( RestClient.builder("localhost:9200")); // 构建查询请求 SearchRequest searchRequest = new SearchRequest("your_index_name"); searchRequest.types("your_document_type"); // 替换为你的索引和文档类型 // 构建查询条件 SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); sourceBuilder.query(QueryBuilders .functionScoreQuery(QueryBuilders.matchAllQuery()) .add(ScoreFunctionBuilders .scriptFunction(new Script( ScriptType.INLINE, "knn", "params.queryVector = [1, 2, 3];\n" + "params.field = 'your_vector_field';\n" + "double[] vector = doc[params.field].value;\n" + "double sum = 0;\n" + "for (int i = 0; i < vector.length; i++) {\n" + " sum += Math.pow(vector[i] - params.queryVector[i], 2);\n" + "}\n" + "return 1 / (1 + Math.sqrt(sum));", null))) .boostMode("replace")); // 设置查询结果的距离单位 sourceBuilder.trackScores(true).trackTotalHits(true) .postFilter(QueryBuilders .geoDistanceQuery("location") .point(40, -70) // 中心点坐标 .distance(10, DistanceUnit.MILES)); // 距离与单位 searchRequest.source(sourceBuilder); try { // 执行查询 SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT); // 处理查询结果 // ... } catch (IOException e) { e.printStackTrace(); } finally { // 关闭Elasticsearch客户端连接 try { client.close(); } catch (IOException e) { e.printStackTrace(); } } } } ``` 在上面的示例代码中,我们使用了function_score查询来执行向量相似度计算。`params.queryVector`是你要查询的向量数据,`params.field`是存储向量数据的字段名。你可以根据实际情况修改这两个参数。 注意,在执行查询之前,你需要替换`"your_index_name"`和`"your_document_type"`为你的索引名和文档类型名。此外,你还可以根据需要设置其他查询条件,例如地理位置过滤等。 希望这个示例对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

麦片王子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值