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;
    }
相關文章
相關標籤/搜索