Es原生api

Relational DB -> Databases -> Tables -> Rows -> Columns
Elasticsearch -> Indices   -> Types  -> Documents -> Fields

Es

ik分詞器與Es集成 查詢方式:0)id 1) trim 2) query_string

安裝 Es 將IK 解壓後的ElasticSearch 文件夾放到 Es 中 Plugin 裏

ik分詞器使用時 在請求路徑下 添加參數 ?analyzer=ik_smart&text=交友網站

Es 原生api

<dependencies>
    <dependency>
        <groupId>org.elasticsearch</groupId>
        <artifactId>elasticsearch</artifactId>
        <version>5.6.8</version>
    </dependency>
    <dependency>
        <groupId>org.elasticsearch.client</groupId>
        <artifactId>transport</artifactId>
        <version>5.6.8</version>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-to-slf4j</artifactId>
        <version>2.11.2</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.24</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-simple</artifactId>
        <version>1.7.21</version>
    </dependency>
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.12</version>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
        <version>2.8.1</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.8.1</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-annotations</artifactId>
        <version>2.8.1</version>
    </dependency>
</dependencies>
public class ElasticSearchClientTest {
    private TransportClient client;

    @Before
    public void init() throws Exception {
        //1.創建一個settings對象,相當於是是配置信息
        Settings builder = Settings.builder()
                .put("cluster.name", "my-elasticsearch").build();
        //2.創建一個客戶端對象
        client = new PreBuiltTransportClient(builder);
        client.addTransportAddress(new InetSocketTransportAddress(
                InetAddress.getByName("127.0.0.1"), 9300)
        );
    }

    //創建索引庫
    @Test
    public void createIndex() throws UnknownHostException {

        client.addTransportAddress(new InetSocketTransportAddress(
                InetAddress.getByName("127.0.0.1"), 9301)
        );
        //3.創建client對象創建一個索引庫
        client.admin().indices().prepareCreate("index-hello1")
                //執行操作
                .get();
        //4.關閉client
        client.close();

    }

    //使用java客戶端設置mapping
    @Test
    public void setMappings() throws Exception {
        client.addTransportAddress(new InetSocketTransportAddress(
                InetAddress.getByName("127.0.0.1"), 9300)
        );
        client.addTransportAddress(new InetSocketTransportAddress(
                InetAddress.getByName("127.0.0.1"), 9301)
        );
        //創建一個Mappings信息
        XContentBuilder builders = XContentFactory.jsonBuilder()
                .startObject() //{
                .startObject("article")
                .startObject("properties")
                .startObject("id")
                .field("type", "integer").field("store", "yes")
                .endObject()
                .startObject("title")
                .field("type", "string").field("store", "yes").field("analyzer", "ik_smart")
                .endObject()
                .startObject("content")
                .field("type", "string").field("store", "yes").field("analyzer", "ik_smart")
                .endObject()
                .endObject()
                .endObject()//}
                .endObject();
        // 創建映射
       /* PutMappingRequest mapping = Requests.putMappingRequest("index-hello")
                .type("article").source(builders);
        client.admin().indices().putMapping(mapping).get();*/
        client.admin().indices().
                //設置要映射的索引
                        preparePutMapping("index-hello1")
                //設置要做映射的type
                .setType("article")
                //mapping信息,可以是XContentBuilder對象可以是json格式的字符串
                .setSource(builders)
                .get();
        //釋放資源
        client.close();

    }
    //添加文檔
/*
    步驟:
    1>創建一個Settings對象
    2>創建一個Client對象
    3>創建一個文檔對象,創建一個json格式的字符串或者使用XContertBuilder
    4>使用client對象添加到索引庫中

*/

    @Test
    public void testAddDocument() throws Exception {
        //創建一個client對象
        //創建一個文檔對象
        XContentBuilder builder = XContentFactory.jsonBuilder()
                .startObject()
                .field("id", 1)
                .field("title", "ElasticSearch是一個基於Lucene的搜索服務器")
                .field("content",
                        "它提供了一個分佈式多用戶能力的全文搜索引擎,基於RESTful web接口。Elasticsearch是用Java開發的,並作爲Apache許可條款下的開放源碼發佈,是當前流行的企業級搜索引擎。設計用於雲計算中,能夠達到實時搜索,穩定,可靠,快速,安裝使用方便。")
                .endObject();
        //把文檔對象添加到索引庫
        client.prepareIndex().setIndex("index-hello1")
//                設置索引名稱
                .setType("article")
                .setId("1")
                //執行文檔信息
                .setSource(builder)
                //執行操作
                .get();
    }


    @Test
    public void testAddDocument2() throws JsonProcessingException {

        //創建一個article對象
        Article article = new Article();
        //設置對象的屬性
        article.setId(2l);
        article.setTitle("逃不過不放手");
        article.setContent("化工太難過哈哈哈哈哈");
        //將Article對象轉換爲json格式的字符串,或者使用XContentBuilder
        ObjectMapper objectMapper = new ObjectMapper();
        String jsonDoc = objectMapper.writeValueAsString(article);
        System.out.println(jsonDoc);
        //使用Client對象吧文檔添加到索引庫中
        client.prepareIndex("index-hello1", "article", "2").setSource(jsonDoc, XContentType.JSON).get();
        //關閉client
        client.close();

    }
    //實現搜索,
    //1. 根據id搜索,
    //2.根據term(關鍵詞)進行查詢
    //3.QueryString查詢方式(帶分析的查詢)

    /*
    創建一個client對象
    創建一個查詢對象,可以使用QueryBuilds工具類
    使用client執行查詢

     */
    @Test
    public void testSearchById() throws Exception {

        //創建一個client對象
        //創建一個查詢對象根據id查詢,可以查詢多個id
        QueryBuilder queryBuilder = QueryBuilders.idsQuery().addIds("1", "2");

        //執行查詢  ↓ 可抽取爲一個方法 search(queryBuilder)
        SearchResponse searchBuilder = client.prepareSearch("index-hello1").setTypes("article").setQuery(queryBuilder).get();
        //取查詢結果
        SearchHits searchHits = searchBuilder.getHits();
        //取查詢結果的總記錄數
        System.out.println("查詢結果總記錄數" + searchHits.getTotalHits());
        //查詢結果列表
        Iterator<SearchHit> iterator = searchHits.iterator();
        while (iterator.hasNext()) {
            SearchHit searchHit = iterator.next();
            String sourceAsString = searchHit.getSourceAsString();
            //打印文檔json對象
            System.out.println(sourceAsString);
            //文檔的屬性
            System.out.println("-----文檔的屬性");
            Map<String, Object> document = searchHit.getSource();
            System.out.println(document.get("id"));
            System.out.println(document.get("title"));
            System.out.println(document.get("content"));
        }
        //關閉client
        client.close();

    }

    //utils  提取search
    private void search(QueryBuilder queryBuilder) throws Exception {
        //執行查詢
        SearchResponse searchBuilder = client.prepareSearch("index-hello1")
                .setTypes("article").setQuery(queryBuilder)
                //設置分頁信息
                .setFrom(0)
                .setSize(5)
                .get();
        //取查詢結果
        SearchHits searchHits = searchBuilder.getHits();
        //取查詢結果的總記錄數
        System.out.println("拆查詢結果總記錄數" + searchHits.getTotalHits());
        //查詢結果列表
        Iterator<SearchHit> iterator = searchHits.iterator();
        while (iterator.hasNext()) {
            SearchHit searchHit = iterator.next();
            String sourceAsString = searchHit.getSourceAsString();
            //打印文檔對象
            System.out.println("文檔對象的json形式:" + sourceAsString);
            //文檔的屬性
            System.out.println("-----文檔的屬性----------");
            Map<String, Object> document = searchHit.getSource();
            System.out.println("id--->"+document.get("id"));
            System.out.println("title--->"+document.get("title"));
            System.out.println("content--->"+document.get("content"));
        }
        //關閉client
        client.close();

    }

    //根據term查詢
    @Test
    public void testQueryByTerm() throws Exception {

        //創建一個queryBuild
        //1.搜索字段,搜索關鍵詞
        TermQueryBuilder queryBuilder = QueryBuilders.termQuery("title", "放手");
        //使用search 執行查詢,傳入queryBuilder
        search(queryBuilder);
    }


    @Test
    public void testQueryStringQuery() throws Exception {
        //創建一個QueryBuilder對象
        QueryStringQueryBuilder queryBuilder = QueryBuilders.queryStringQuery("哈哈").defaultField("content");
        search(queryBuilder);

    }


    //分頁數據
    //在執行查詢之前,設置分頁就行,使用設置高亮的search方法
    @Test
    public void testQueryStringQueryPage() throws Exception {

        QueryStringQueryBuilder queryBuilder = QueryBuilders.queryStringQuery("哈哈").defaultField("content");
        search(queryBuilder, "content");

    }



    /**
     * 高亮顯示
     * @throws JsonProcessingException
     */
    private void search(QueryBuilder queryBuilder, String highlight) throws Exception {

        HighlightBuilder highlightBuilder = new HighlightBuilder();
        highlightBuilder.field(highlight);
        highlightBuilder.preTags("<em>");
        highlightBuilder.postTags("</em>");

        //執行查詢
        SearchResponse searchBuilder = client.prepareSearch("index-hello").setTypes("article").setQuery(queryBuilder)
                //設置分頁信息
                .setFrom(0)
                .setSize(5)
                //高亮顯示
                .highlighter(highlightBuilder)
                .get();
        //取查詢結果
        SearchHits searchHits = searchBuilder.getHits();
        //取查詢結果的總記錄數
        System.out.println("查詢結果總記錄數" + searchHits.getTotalHits());
        System.out.println("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
        //查詢結果列表
        Iterator<SearchHit> iterator = searchHits.iterator();

        while (iterator.hasNext()) {
            SearchHit searchHit = iterator.next();
            String sourceAsString = searchHit.getSourceAsString();
            //打印文檔對象
            System.out.println("文檔的json格式:-->"+sourceAsString);
            //文檔的屬性
            System.out.println("-----文檔的屬性");
            Map<String, Object> document = searchHit.getSource();
            System.out.println("id:"+document.get("id"));
            System.out.println("title:"+document.get("title"));
            System.out.println("content:"+document.get("content"));

            Map<String, HighlightField> highlightFields = searchHit.getHighlightFields();
            System.out.println("*****高亮結果******"+highlightFields);     //獲取的是一個k,v格式的map  k爲查詢的字段  v爲高亮後的內容

            //取高亮顯示的結果
            HighlightField field = highlightFields.get(highlight);
            
            Text[] fragments = field.getFragments();  //高亮顯示的片段
            if (fragments != null) {
                String title = fragments[0].toString();
                System.out.println("高亮結果後的:" + title);
                System.out.println("++++++++++++++++++++++++++++++++++++++++");
            }
        }
        //關閉client
        client.close();
    }

    //批量添加數據
    @Test
    public void testAddDocument3() throws JsonProcessingException {
        //創建一個article對象
        Article article = new Article();

        for (int i = 4; i < 100; i++) {
            //設置對象的屬性
            article.setId(i);
            article.setTitle("逃不過不放手" + i);
            article.setContent("化工太難過哈哈哈哈哈" + i);
            //將Article對象轉換爲json格式的字符串,或者使用XContentBuilder
            ObjectMapper objectMapper = new ObjectMapper();
            String jsonDoc = objectMapper.writeValueAsString(article);
            System.out.println(jsonDoc);
            //使用Client對象吧文檔添加到索引庫中
            client.prepareIndex("index-hello1", "article", i + "").setSource(jsonDoc, XContentType.JSON).get();

        }

        //關閉client
        client.close();

    }


}
public class Article {

    private long id;
    private  String  title;
    private String  content;

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }
}
``
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章