ElasticSearchサーチインスタンス

9372 ワード

public void search() throws IOException {
        //          
        String clusterName = "elasticsearch_pudongping";

        //      
        Client client = ESClient.initClient(clusterName);

        //       ,  productindex          productindex
        SearchRequestBuilder searchRequestBuilder = client
                .prepareSearch("productindex");

        //         ,setTypes("productType1", "productType2","productType3");
        //             
        searchRequestBuilder.setTypes("productIndex");

        //        1.SearchType.DFS_QUERY_THEN_FETCH =      2.SearchType.SCAN =
        //     ,  
        searchRequestBuilder.setSearchType(SearchType.DFS_QUERY_THEN_FETCH);

        //        
        searchRequestBuilder
                .setQuery(QueryBuilders.fieldQuery("title", "Acer"));

        //           4000-5000       [4000,5000]     ,         4000    5000   
        searchRequestBuilder.setFilter(FilterBuilders.rangeFilter("price")
                .from(4000).to(5000));

        //     
        searchRequestBuilder.setFrom(0).setSize(60);

        //             
        searchRequestBuilder.setExplain(true);

        //     ,        
        SearchResponse response = searchRequestBuilder.execute().actionGet();

        SearchHits searchHits = response.getHits();
        SearchHit[] hits = searchHits.getHits();
        for (int i = 0; i < hits.length; i++) {
            SearchHit hit = hits[i];
            Map<String, Object> result = hit.getSource();
            //   map  :{id=26, onSale=true, title=  Acer 3, price=4009.0,
            // description=null, createDate=1380530123140, type=2}
            System.out.println(result);
        }
        System.out.println("search success ..");

    }

説明:
client.prepareSearchは、SearchRequestBuilderを作成するために使用され、検索はSearchRequestBuilderによって実行されます.
client.prepareSearchメソッドには、1つ以上のindexパラメータがあり、データベースに表示されます.つまり、0つ以上のデータベース名です.使用できます(次の2つは、複数のインデックス・ライブラリで検索できることを示します):
client.prepareSearch().setIndices("index1","index2","index3","index4");
または、
client.prepareSearch("index1","index2","index3","index4");
SearchRequestBuilderの一般的な方法の説明:
(1)setIndices(String...indices):前述したように、パラメータは、取得するindexを表す1つ以上の文字列であってもよい.
(2)settypes(String...types):パラメータは、取得するtypeを表す1つ以上の文字列であってもよく、パラメータが0個であるか、このメソッドを呼び出さない場合、クエリーのすべてのtypeを表す.
setSearchType(SearchType searchType):検索を実行するカテゴリで、値はorg.elasticsearch.action.search.SearchTypeの要素で、SearchTypeは列挙タイプのクラスで、その値は以下の通りです:QUERY_THEN_FETCH:クエリはすべてのブロックに対して実行されますが、ドキュメントコンテンツ(Document)ではなく十分な情報が返されます.結果はソートされ、階層化されます.これに基づいて、関連するブロックのドキュメントオブジェクトのみが返されます.取り出されたのはこれだけであるため,返されるhitの大きさは指定したsizeにちょうど等しい.これは多くのブロックがあるindexにとって便利である(ブロックがグループ化されているため、戻り結果は重複しない)QUERY_AND_FETCH:最もオリジナル(または最も速い)実装は、すべての関連shard上で検索を簡単に実行し、結果を返すことです.各shardは一定サイズの結果を返します.各shardはすでに一定サイズのhitを返しているため、このタイプは実際には複数のshardの一定サイズを返した結果を呼び出し者に与える.  DFS_QUERY_THEN_FETCH:とQUERY_THEN_FETCHと同様に,より正確なscore計算のために割り当てられたterm周波数を伴う初期散乱が期待される.  DFS_QUERY_AND_FETCH:とQUERY_AND_FETCHと同様に,より正確なscore計算のために割り当てられたterm周波数を伴う初期散乱が期待される.SCAN:ソートされていない検索が実行されたときにブラウズを実行します.結果セットのスクロールが自動的に開始されます.COUNT:結果の数だけを計算し、facetも実行します.
(4)setSearchType(String searchType)は、setSearchType(SearchType searchType)と類似しており、その値が文字列型のSearchTypeであり、値がdfs_query_then_fetch、dfsQueryThenFetch、dfs_query_and_fetch、dfsQueryAndFetch、query_then_fetch、queryThenFetch、query_and_fetchまたはqueryAndFetch;
(5)setScroll(Scroll scroll)、setScroll(TimeValue keepAlive)、setScroll(String keepAlive)は、スクロールを設定し、パラメータがScrollの場合、new Scroll(TimeValue)で直接Scrollを構築し、TimeValueまたはStringの場合はTimeValueとStringをScrollに変換する必要がある.
(6)settimout(TimeValue timeout)とsettimout(String timeout)は、検索のタイムアウト時間を設定する.
(7)setQuery,クエリが使用するQueryを設定する.
(8)setFilter、フィルタを設定する;
(9)setMinScore、Scoreの最小数を設定する.
(10)setFrom、どのScoreから調べるか.
(11)setSize、どのくらいの結果をクエリーする必要がありますか?
結果を検索するresponse.getHits()はすべてのSearchHitを得ることができ,Hitを得ると,Hitを反復して対応するDocumentに取り,必要なエンティティに変換することができる.
2.検索ハイライト表示
SearchRequestBuilderのaddHighlightedField()メソッドでは、どのドメイン値の検索結果のキーワードにハイライトを追加するかをカスタマイズできます.
public void search() throws IOException {
        //          
        String clusterName = "elasticsearch_pudongping";
       
        //      
        Client client = ESClient.initClient(clusterName);   

        //       ,  productindex          productindex
        SearchRequestBuilder searchRequestBuilder = client
                .prepareSearch("productindex");

        //         ,setTypes("productType1", "productType2","productType3");
        //             
        searchRequestBuilder.setTypes("productIndex");

        //        1.SearchType.DFS_QUERY_THEN_FETCH =      2.SearchType.SCAN =     ,  
        searchRequestBuilder.setSearchType(SearchType.DFS_QUERY_THEN_FETCH);

        //        
        searchRequestBuilder
                .setQuery(QueryBuilders.fieldQuery("title", "Acer"));

        //           4000-5000       [4000,5000]     ,         4000    5000   
        searchRequestBuilder.setFilter(FilterBuilders.rangeFilter("price")
                .from(4000).to(5000));

        //     
        searchRequestBuilder.setFrom(0).setSize(60);

        //             
        searchRequestBuilder.setExplain(true);
       
        //      
        searchRequestBuilder.addHighlightedField("title");
        searchRequestBuilder.setHighlighterPreTags("<span style=\"color:red\">");
        searchRequestBuilder.setHighlighterPostTags("</span>");
        //     ,        
        SearchResponse response = searchRequestBuilder.execute().actionGet();
       
        //         
        SearchHits searchHits = response.getHits();
        SearchHit[] hits = searchHits.getHits();
        ObjectMapper mapper = new ObjectMapper();
        for (int i = 0; i < hits.length; i++) {
            SearchHit hit = hits[i];
            //            json  
            String json = hit.getSourceAsString();
            // json            
            Product product = mapper.readValue(json, Product.class); 
           
            //        
            Map<String, HighlightField> result = hit.highlightFields();   
            //             
            HighlightField titleField = result.get("title"); 
            //         
            Text[] titleTexts =  titleField.fragments();   
            // title            
            String title = ""; 
            for(Text text : titleTexts){   
                  title += text; 
            }
            //                     
            product.setTitle(title);
            //                
            System.out.println(product);
        }
        System.out.println("search success ..");

    }

プログラムの実行結果:
[i d=8,title=マクロベースAcer,description=マクロベースAcer蜂鳥シリーズ,price=5000.0,onSale=true,type=1,createDate=MonSep 30 13:46:41 CST 2013[id=21,title=マクロベースAcer,description=マクロベースAcer蜂鳥シリーズ,price=5000.0,onSale=true,type=1,createe=1,createeeeeeeeeee=8,title=8,title=8,title==マクロベースAcer,description=マクロベースAcer蜂鳥シリーズ,price=5000.0,onSale=true,type=1,createDate=Mon Sep 30 11:38:50 CST 2013[id=5,title=マクロベースAcer楽0,description=楽0,description=Acer楽1,description=Acer楽2,description=Acer楽3,description=Acer楽4,description=プログラムの実行結果から、定義したハイライトラベルが指定したドメインに追加されていることがわかります.
インデックスを検索すると、検索キーワードに特殊な文字が含まれていると、プログラムがエラーを報告します.
//fieldQueryこれはあなたのインデックスフィールドでなければなりませんよ.そうしないとデータが調べられません.ここでは2つのフィールドidだけを設定します.title String title=「title+-&&!(){}[]^」~*?:\「;title=QueryParser.escape(title);//主にこの文が特殊文字をすべてエスケープすると、luceneはsearchRequestBuilder.setQuery(QueryBuilder.fieldQuery("title",title))を識別することができる.