yujian
2019-12-26 63297514a8ae8117cc20f7e2e8863313edf45997
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
package com.yeshi.fanli.dao.elastic;
 
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
 
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.common.unit.Fuzziness;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.MatchQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.query.TermQueryBuilder;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.springframework.stereotype.Repository;
 
import com.google.gson.Gson;
import com.yeshi.fanli.dao.ElasticBaseDao;
import com.yeshi.fanli.entity.order.ESOrder;
 
@Repository
public class ESOrderDao extends ElasticBaseDao<ESOrder> {
 
    /**
     * 查询匹配
     * 
     * @param key 搜索词
     * @param uid 用户id
     * @return
     */
    public List<ESOrder> queryMatch(String key, String uid) {
        List<ESOrder> list = new ArrayList<ESOrder>();
 
        // 商品名称匹配
        MatchQueryBuilder match1 = new MatchQueryBuilder("goodsName", key).fuzziness(Fuzziness.AUTO);
        // 订单号匹配
        MatchQueryBuilder match2 = new MatchQueryBuilder("orderNo", key).fuzziness(Fuzziness.AUTO);
 
        TermQueryBuilder term1 = QueryBuilders.termQuery("uid", uid);
        // 上级
        TermQueryBuilder term2 = QueryBuilders.termQuery("uidDirect", uid);
        // 上上级
        TermQueryBuilder term3 = QueryBuilders.termQuery("uidIndirect", uid);
 
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        sourceBuilder.query(match1).query(match2).query(term1).query(term2).query(term3);
 
        SearchRequest searchRequest = new SearchRequest();
        searchRequest.indices(index);
        searchRequest.source(sourceBuilder);
        try {
            SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
            SearchHits hits = searchResponse.getHits();
            SearchHit[] searchHits = hits.getHits();
            Gson gson = new Gson();
            for (SearchHit hit : searchHits) {
                String content = hit.getSourceAsString();
                list.add(gson.fromJson(content, ESOrder.class));
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return list;
    }
 
    /**
     * 查询匹配
     * 
     * @param key 搜索词
     * @param uid 用户id
     * @return
     */
    public List<ESOrder> query(String key, String uid) {
        List<ESOrder> list = new ArrayList<ESOrder>();
        // 商品名称匹配
        BoolQueryBuilder should1 = QueryBuilders.boolQuery().should(QueryBuilders.matchPhraseQuery("orderNo", key))
                .should(QueryBuilders.matchPhraseQuery("goodsName", key));
        // 用户id匹配
        BoolQueryBuilder should2 = QueryBuilders.boolQuery().should(QueryBuilders.termQuery("uid", uid))
                .should(QueryBuilders.termQuery("uidDirect", uid)).should(QueryBuilders.termQuery("uidDirect", uid));
 
        // 查询创建
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        sourceBuilder.query(QueryBuilders.boolQuery().must(should1).must(should2));
        
        SearchRequest searchRequest = new SearchRequest();
        searchRequest.indices(index);
        searchRequest.source(sourceBuilder);
        try {
            SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
            SearchHits hits = searchResponse.getHits();
            SearchHit[] searchHits = hits.getHits();
            Gson gson = new Gson();
            for (SearchHit hit : searchHits) {
                String content = hit.getSourceAsString();
                list.add(gson.fromJson(content, ESOrder.class));
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return list;
    }
 
}