1. 程式人生 > >Elasticsearch 5.1.1搜尋高亮及Java API實現

Elasticsearch 5.1.1搜尋高亮及Java API實現

5.1.1的搜尋高亮和2.X有所變化,但是變化不大。下面分四步來介紹:建立索引(設定mapping/IK分詞)、索引文件、REST API的搜尋高亮、JAVA API的搜尋高亮。
注:從這篇部落格開始,採用簡寫的程式碼風格,也就是Sence外掛或者kibana的dev tools中採用的風格。(溫馨提示:安裝kibana 5.1.1,在dev tools中直接可以使用簡單格式命令。)

一、建立索引

文件結構為blog/article/id。先建立一個空的index:

PUT blog

建立mapping:

POST blog/article/_mapping
{
  "article"
: { "properties": { "title": { "type": "text", "analyzer": "ik_max_word", "search_analyzer": "ik_max_word", "boost": 8 }, "content": { "type": "text", "analyzer": "ik_max_word", "search_analyzer": "ik_max_word", "boost"
: 4 } } } }

二、索引測試文件

加入三條文件到blog索引。
文件1:

POST blog/article/1
{
  "title":"java程式設計思想",
  "content":"《Java程式設計思想》這本書贏得了全球程式設計師的廣泛讚譽"
}

文件2:

POST blog/article/2
{
  "title":"手把手教你使用Git",
  "content":"這是一個非常容易上手的GIt詳細教程"
}

文件3:

POST blog/article/3
{
  "title":"java從入門到精通",
  "content"
:"《java從入門到精通》非常適合java初學" }

三、REST高亮API

我們查詢title中含有java的文件,並用自定義高亮片段標記出來。

POST blog/_search
{
  "query": {
    "match": {
      "title": "java"
    }
  },
  "highlight": {
    "fields": {
      "title": {
        "pre_tags": "<strong>",
        "post_tags": "</strong>"
      }
    }
  }
}

查詢結果:

    "total": 2,
    "max_score": 2.3014567,
    "hits": [
      {
        "_index": "blog",
        "_type": "article",
        "_id": "3",
        "_score": 2.3014567,
        "_source": {
          "title": "java從入門到精通",
          "content": "《java從入門到精通》非常適合java初學"
        },
        "highlight": {
          "title": [
            "<strong>java</strong>從入門到精通"
          ]
        }
      },
      {
        "_index": "blog",
        "_type": "article",
        "_id": "1",
        "_score": 2.025282,
        "_source": {
          "title": "java程式設計思想",
          "content": "《Java程式設計思想》這本書贏得了全球程式設計師的廣泛讚譽"
        },
        "highlight": {
          "title": [
            "<strong>java</strong>程式設計思想"
          ]
        }
      }
    ]
  }
}

這裡寫圖片描述

四、搜尋高亮的java api實現

package esjavapia5;
import java.net.InetAddress;
import java.net.UnknownHostException;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.text.Text;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.transport.client.PreBuiltTransportClient;
public class Es5Highlight {
    public static void main(String[] args) throws UnknownHostException {
        // TODO Auto-generated method stub
        // 設定叢集名稱
        Settings settings = Settings.builder()
                .put("cluster.name", "elasticsearch").build();
        // 建立client
        TransportClient client = new PreBuiltTransportClient(settings)
                .addTransportAddress(new InetSocketTransportAddress(
                        InetAddress.getByName("127.0.0.1"), 9300));
        QueryBuilder matchQuery = QueryBuilders.matchQuery("title", "程式設計");
        HighlightBuilder hiBuilder=new HighlightBuilder();
        hiBuilder.preTags("<h2>");
        hiBuilder.postTags("</h2>");
        hiBuilder.field("title");
        // 搜尋資料
        SearchResponse response = client.prepareSearch("blog")
                .setQuery(matchQuery)
                .highlighter(hiBuilder)
                .execute().actionGet();
        //獲取查詢結果集
        SearchHits searchHits = response.getHits();
        System.out.println("共搜到:"+searchHits.getTotalHits()+"條結果!");
        //遍歷結果
        for(SearchHit hit:searchHits){
            System.out.println("String方式列印文件搜尋內容:");
            System.out.println(hit.getSourceAsString());
            System.out.println("Map方式列印高亮內容");
            System.out.println(hit.getHighlightFields());

            System.out.println("遍歷高亮集合,列印高亮片段:");
            Text[] text = hit.getHighlightFields().get("title").getFragments();
            for (Text str : text) {
                System.out.println(str.string());
            }
        }
    }
}

執行結果:

no modules loaded
loaded plugin [org.elasticsearch.index.reindex.ReindexPlugin]
loaded plugin [org.elasticsearch.percolator.PercolatorPlugin]
loaded plugin [org.elasticsearch.script.mustache.MustachePlugin]
loaded plugin [org.elasticsearch.transport.Netty3Plugin]
loaded plugin [org.elasticsearch.transport.Netty4Plugin]
共搜到:1條結果!
String方式列印文件搜尋內容:
{
  "title":"java程式設計思想",
  "content":"《Java程式設計思想》這本書贏得了全球程式設計師的廣泛讚譽"
}

Map方式列印高亮內容
{title=[title], fragments[[java<h2>程式設計</h2>思想]]}
遍歷高亮集合,列印高亮片段:
java<em>程式設計</h2>思想

截圖如下:

這裡寫圖片描述

相關推薦

Elasticsearch 5.1.1搜尋Java API實現

5.1.1的搜尋高亮和2.X有所變化,但是變化不大。下面分四步來介紹:建立索引(設定mapping/IK分詞)、索引文件、REST API的搜尋高亮、JAVA API的搜尋高亮。 注:從這篇部落格開始,採用簡寫的程式碼風格,也就是Sence外掛或者kibana

Elasticsearch Aggregation 多個欄位分組統計 Java API實現

現有索引資料:index:schooltype:student---------------------------------------------------{"grade":"1", "class":"1", "name":"xiao 1"}{"grade":"1",

leaflet 筆記1 marker點顯示

Leaflet 筆記八:marker高亮顯示 這個plugin主要是為了方便實現marker的高亮顯示。 安裝 該庫已經發布到npmjs上,所以安裝非常簡單。 npm install leaflet.marker.highlight --save 原理 突出marke

elasticsearch 5.2.1安裝問題解答

1、啟動 elasticsearch 如出現異常  can not run elasticsearch as root   解決方法:建立ES 賬戶,修改資料夾 檔案 所屬使用者 組 2、啟動異常:ERROR: bootstrap checks failed syst

Elasticsearch 5.6.1 釋出,分散式搜尋引擎

Elasticsearch 5.6.1 已釋出,ElasticSearch 是一個基於 Lucene 構建的開源,分散式,RESTful 搜尋引擎。設計用於雲端計算中,能夠達到實時搜尋,穩定,可靠,快速,安裝使用方便。支援通過 HTTP 使用 JSON 進行資料索引。

Elasticsearch 5.2.1 建立索引-自定義分詞器

開發語言:JAVA 解決問題:ES 5.2.1預設使用的 standard 分詞器,該分詞器是單個漢字進行分詞的,而需求使用二元分詞,故使用ngram 實現二元分詞 通過mapping 將分詞器 與要分詞的欄位進行對映 示例程式碼: // DoubleAnalyzer

一個電話本中聯絡人名字搜尋實現

一個電話本中聯絡人名字搜尋高亮的實現 需求:實現電話本名字搜尋功能的高亮實現,其中搜索支援中文、簡拼、全拼搜尋,對搜尋匹配到的名字部分高亮顯示。 例如: 名字:張向東 全拼:zhangxiangdong 簡拼:zxd 搜尋匹配優先規則:中文(直接匹配)、簡拼匹配、全

微信小程式的搜尋、自定義導航條等踩坑記錄

原文地址:https://oomabc.com/articledetail?atclid=7421fe13daad46389791463f51d3395d   前言我在寫這個部落格的小程式過程中,遇到了很多的問題。之前斷斷續續也寫過不少JavaScript和css,不過都是半吊子。所以在看了一會

關於springDataSolr搜尋關鍵字的實現

關於springDataSolr搜尋高亮關鍵字的實現 com.pinyougou.search.service.impl;/* ClassName:ItemSearchServiceImpl Author: Lzc Company:www.lzc.com Date: 2018/11/12 1

elasticsearch(5) 請求體搜尋

上一篇提到的輕量搜尋非常簡單便捷,但是通過請求體查詢可以更充分的利用查詢的強大功能。因為_search api中大部分引數是通過HTTP請求體而非查詢字串來傳遞的。 一 空查詢 對於空查詢來說,最簡單的方式就是傳入一個空的請求體,獲取所有文件(預設返回前10個完整文件內容) GET 127.0.0

ABAP-BarCode-1-二維碼列印動態螢幕實現

很久很久。。。以前寫的一個測試程式,主要是通過ABAP與HTML互動,編寫JavaScript實現二維碼及動態螢幕實現。 1.ABAP介面效果  2.實現程式碼 1 *&--------------------------------------------------

Solr實現商城搜尋顯示

package com.pinyougou.search.service.impl; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; im

基於Vue實現關鍵詞實時搜尋顯示關鍵詞

最近在做移動real-time-search於實時搜尋和關鍵詞高亮顯示的功能,通過部落格的方式總結一下,同時希望能夠幫助到別人~~~ 好了閒話不多說直接上程式碼 實時搜尋 實時搜尋通過觸發input事件和定時器來實現 <input v-model="keyW

js模擬瀏覽器Ctrl+F 搜尋

原理:通過獲取使用者輸入(此處用定義變數代表)的內容,然後將搜尋頁面的指定標籤內所有HTML儲存於content變數,再通過js正則replace替換content中包含使用者輸入的關鍵字的地方,替換

js搜尋 匹配關鍵字,即時展示相關資料

searchCont:function(el,flag){ var _this = this; //空格替換 el.value = el.value.re

簡單高效的js搜尋

一、效果搶鮮展示 此外掛是我今天下午寫的,為了直觀地看到是個什麼東東,先展示效果,您可以狠狠地點選這裡:搜尋頁面文字jQuery外掛Demo 下圖為Demo頁面的兩個測試截圖 – 測試頁面HTML程式碼取自豆瓣網幫助頁面: 二、功能簡述 從上圖也應該看出來了,就是對HT

有關ansj的IndexAnalysis的分詞對elasticsearch的fast vector highlight會產生BUG的問題分析

IndexAnalysis是ansj分詞工具針對搜尋引擎提供的一種分詞方式,會進行最細粒度的分詞,例如下面這句話: 看熱鬧:2014年度足壇主教練收入榜公佈,溫格是真·阿森納代言人啊~ 這句話會被拆分成:[看熱鬧/v, :/w, 2014/m, 年度/n, 足壇/n, 主

unity vr抓取 觸碰顏色變換

給物體新增四個指令碼:“VRTK_SwapControllerGrabAction”,“VRTK_FixedJointGrabAttach”,“VRTK_InteractableObject”,“VRTK_OutlineObjectCopyHighlighter”。 其中

設定vim C的語法自動縮排

vim簡介 Vim(Vi Improved) 是一個類似於vi 的文字編輯器,在Vi的基礎上增加了很多新的特性和功能。Vim以其強大的功能和可定製能力,成為Linux/Unix環境下開源的最重要的編輯器之一(另一個是 Emacs),被眾多開發者所喜愛。筆者此時所用的是最新的

[csdn markdown]使用摘記一原始碼圖片上傳和連結

本文主要內容是體驗csdn markdown的程式碼塊高亮顯示和圖片連結及上傳。 圖片上傳 上邊這是標題行,只需要使用一個#就可以表示,幾個表示是幾級標題 如果想要自動根據標題生成目錄,那麼就使用[TOC] 標記來表示這裡是目錄,並且會自動生成。