ElasticSearch 数据的检索

Posted Forever-Road

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ElasticSearch 数据的检索相关的知识,希望对你有一定的参考价值。

 

  ElasticSearch 的检索没有Solr那么多类别,ElasicSearch默认是模糊查询,通过使用余弦相似度量算法来判断keyword和检索值的相似度,然后取出相似度最高的数据作为返回。

//检索主体函数
    public JSONArray Query(String keyword)
    {
        //单字段查询
        //MatchQueryBuilder query = QueryBuilders.matchQuery("poi_title", "xxxx大学");
        //多字段查询字段
        MultiMatchQueryBuilder query = 
                QueryBuilders.multiMatchQuery(keyword, "poi_address","poi_title","poi_tags");
        //高亮
        HighlightBuilder highlight = new HighlightBuilder();
        highlight.preTags("<span class = ‘highlight‘>")
                .postTags("</span>")
                    .field("poi_title")
                        .field("poi_address")
                            .field("poi_tags");
        //检索设置
        SearchResponse response = client.prepareSearch("pois")
                .setTypes("cxyword")
                    .setQuery(query)
                        .highlighter(highlight)
                            .setFrom(0)
                                .setSize(5)   //从0开始,默认推荐5个
                                    .execute()
                                        .actionGet();
        //执行检索
        SearchHits hits = response.getHits();
        //以json数组存储搜索结果
        JSONArray jsonArray = new JSONArray();
        JSONObject jsonObject = null;
        System.out.println("共搜到:"+hits.getTotalHits()+"条结果");
        for (SearchHit hit : hits)
        {
            jsonObject = new JSONObject();
            
            //首先判断该字段是否存在高亮,存在则拉取高亮,不存在则拉取整个字段
            jsonObject.put("poi_title", 
                    hit.getHighlightFields().get("poi_title") != null ?
                            getFraStr(hit.getHighlightFields().get("poi_title").getFragments()):
                            hit.getSource().get("poi_title"));
            
            jsonObject.put("poi_address", 
                    hit.getHighlightFields().get("poi_address") != null ?
                            getFraStr(hit.getHighlightFields().get("poi_address").getFragments()):
                            hit.getSource().get("poi_address"));

            jsonObject.put("poi_tags", 
                    hit.getHighlightFields().get("poi_tags") != null ?
                            getFraStr(hit.getHighlightFields().get("poi_tags").getFragments()):
                            hit.getSource().get("poi_tags"));
            
            jsonObject.put("poi_lat", hit.getSource().get("poi_lat"));
            jsonObject.put("poi_lng", hit.getSource().get("poi_lng"));
            jsonObject.put("poi_photel", hit.getSource().get("poi_photel"));
            jsonObject.put("id", hit.getId());
            jsonArray.add(jsonObject);
        }
        return jsonArray;
    }

 

以上是关于ElasticSearch 数据的检索的主要内容,如果未能解决你的问题,请参考以下文章

ElasticSearch 亿级数据检索深度优化

ElasticSearch 亿级数据检索深度性能优化

突破性能瓶颈!ElasticSearch百亿级数据检索优化案例

检索数据未出现在 ListView 的片段中

Elasticsearch全文检索技术 一篇文章即可从入门到精通(Elasticsearch安装,安装kibana,安装ik分词器,数据的增删改查,全文检索查询,聚合aggregations)(代码片

小烨收藏ElasticSearch权威指南-入门