Java與ElasticSerach的整合

  • 通過es的mapping數據結構

    • 定義數據庫中的表的結構的定義,通過mapping來控制索引存儲數據的設置
      • 定義Index下的字段名(Field Name)

      • 定義字段的類型,比如數值型、字符串型、布爾型等

      • 定義倒排索引相關的配置,比如documentId、記錄position、打分等

    • 數據類型
核心數據類型
字符串型:text、keyword
數值型:long、integer、shortbytedoublefloat、half_float、scaled_float
日期類型:date
布爾類型:boolean
二進制類型:binary
範圍類型:integer_range、float_range、long_range、double_range、date_range

複雜數據類型
數組類型:array
對象類型:object
嵌套類型:nested object
地理位置數據類型
geo_point()geo_shape(形狀)

專用類型
記錄IP地址ip
實現自動補全completion
記錄分詞數:token_count
記錄字符串hash值母乳murmur3

多字段特性multi-fields
允許對同一個字段採用不同的配置,比如分詞,例如對人名實現拼音搜索,
只需要在人名中新增一個子字段爲pinyin即可
  • 創建mapping
PUT gmall0105
{
  "mappings": {
    "PmsSkuInfo":{
      "properties": {
        "id":{
          "type": "keyword",
          "index": true
        },
        "skuName":{
          "type": "text"
          , "analyzer": "ik_max_word"
        },
        "skuDesc":{
          "type": "text"
          , "analyzer": "ik_smart"
        },
        "catalog3Id":{
          "type": "keyword"
        },
        "price":{
          "type": "double"
        },
        "skuDefaultImg":{
          "type": "keyword"
          , "index": false
        },
        "hostScore":{
          "type": "double"
        },
        "productId":{
          "type": "keyword"
        },
        "skuAttrValueList":{
          "properties": {
            "attrId":{
              "type":"keyword"
            },
            "valueId":{
              "type":"keyword"
            }
          }
        }
      }
    }
  }
}

在這裏插入圖片描述

Java與ElasticSerach的整合

  1. 導入Java與ElasticSerach的依賴
	<!--es的Java客服端-->
			<dependency>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
			</dependency>
	
			<!-- https://mvnrepository.com/artifact/io.searchbox/jest -->
			<dependency>
				<groupId>io.searchbox</groupId>
				<artifactId>jest</artifactId>
				<version>5.3.3</version>
			</dependency>
	
	
			<!-- https://mvnrepository.com/artifact/net.java.dev.jna/jna -->
			<dependency>
				<groupId>net.java.dev.jna</groupId>
				<artifactId>jna</artifactId>
				<version>4.5.1</version>
			</dependency>

2.PmsSearchSkuInf與ElasticSearch中的數據結構對應

public class PmsSearchSkuInfo implements Serializable{

    @Id
    private String id;
    private String skuName;
    private String skuDesc;
    private String catalog3Id;
    private BigDecimal price;
    private String skuDefaultImg;
    private double hostScore;
    private String productId;
    private List<PmsSkuAttrValue> skuAttrValueList;

    public String getId() {
        return id;
    }

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

    public String getSkuName() {
        return skuName;
    }

    public void setSkuName(String skuName) {
        this.skuName = skuName;
    }

    public String getSkuDesc() {
        return skuDesc;
    }

    public void setSkuDesc(String skuDesc) {
        this.skuDesc = skuDesc;
    }

    public String getCatalog3Id() {
        return catalog3Id;
    }

    public void setCatalog3Id(String catalog3Id) {
        this.catalog3Id = catalog3Id;
    }

    public BigDecimal getPrice() {
        return price;
    }

    public void setPrice(BigDecimal price) {
        this.price = price;
    }

    public String getSkuDefaultImg() {
        return skuDefaultImg;
    }

    public void setSkuDefaultImg(String skuDefaultImg) {
        this.skuDefaultImg = skuDefaultImg;
    }

    public double getHostScore() {
        return hostScore;
    }

    public void setHostScore(double hostScore) {
        this.hostScore = hostScore;
    }

    public String getProductId() {
        return productId;
    }

    public void setProductId(String productId) {
        this.productId = productId;
    }

    public List<PmsSkuAttrValue> getSkuAttrValueList() {
        return skuAttrValueList;
    }

    public void setSkuAttrValueList(List<PmsSkuAttrValue> skuAttrValueList) {
        this.skuAttrValueList = skuAttrValueList;
    }
}

3.SkuService.java

public interface SkuService {
	List<PmsSkuInfo> getAllSku();
}

4.PmsSkuInfoMapper實現mybatis的tk.Mapper

public interface PmsSkuInfoMapper extends Mapper<PmsSkuInfo>{
}

5.SkuServiceImpl.java

@Service
public class SkuServiceImpl implements SkuService{

    @Autowired
    PmsSkuInfoMapper pmsSkuInfoMapper;
    
  @Override
    public List<PmsSkuInfo> getAllSku() {
        List<PmsSkuInfo> pmsSkuInfos = pmsSkuInfoMapper.selectAll();
        for (PmsSkuInfo pmsSkuInfo : pmsSkuInfos) {
            String skuId = pmsSkuInfo.getId();
            PmsSkuAttrValue pmsSkuAttrValue=new PmsSkuAttrValue();
            pmsSkuAttrValue.setSkuId(skuId);
            List<PmsSkuAttrValue> pmsSkuAttrValues = 		   pmsSkuAttrValueMapper.select(pmsSkuAttrValue);
            pmsSkuInfo.setSkuAttrValueList(pmsSkuAttrValues);
        }
        return pmsSkuInfos;
    }
}

6.GmallSearchServiceApplication

public class GmallSearchServiceApplication {

	@Reference
	SkuService skuService; //查詢MySQL

	@Autowired
	JestClient jestClient;
	@Test
	public void contextLoads() throws IOException {
		//查詢MySQL數據庫
		List<PmsSkuInfo> pmsSkuInfoList=new ArrayList<>();
		pmsSkuInfoList=skuService.getAllSku();
		//轉化爲es的數據結構
		List<PmsSearchSkuInfo> pmsSearchSkuInfoList=new ArrayList<>();

		for (PmsSkuInfo pmsSkuInfo : pmsSkuInfoList) {
			PmsSearchSkuInfo pmsSearchSkuInfo = new PmsSearchSkuInfo();
			BeanUtils.copyProperties(pmsSkuInfo,pmsSearchSkuInfo);
			pmsSearchSkuInfoList.add(pmsSearchSkuInfo);
		}
		//導入es

		for (PmsSearchSkuInfo pmsSearchSkuInfo : pmsSearchSkuInfoList) {
			Index put = new Index.Builder(pmsSearchSkuInfo).index("gmall0105").type("PmsSkuInfo").id(pmsSearchSkuInfo.getId()).build();
			jestClient.execute(put);
		}


	}

}

7.在elastaicSearch中查詢

//先過濾後查詢一個條件中交集
GET gmall0105/PmsSkuInfo/_search
{
  "query": {
    
    "bool": {
      "filter":[
        {
        "term": {
          "skuAttrValueList.valueId": "39"
          }
          
        }
        , {
          "term": {
          "skuAttrValueList.valueId": "43"
                }
          }
      ]
      , "must": [
        {
          "match": {
            "skuName": "Apple"
          }
        }
      ]
    }
  }
}

ElasticSearch並集與交集查詢

//並集是一個數組
{terms:{"skuAttrValueList.valueId":["39","40","41"]}}
//交際是一個具體值
{term:{"skuArrtValueList.valueId":"39"}}

在這裏插入圖片描述
查詢API

//jest的工具
		SearchSourceBuilder searchSourceBuilder=new SearchSourceBuilder();

		//bool
		BoolQueryBuilder boolQueryBuilder=new BoolQueryBuilder();
		//filter
		TermQueryBuilder termQueryBuilder=new TermQueryBuilder("skuAttrValueList.valueId","39");
		boolQueryBuilder.filter(termQueryBuilder);
		//must
		MatchQueryBuilder matchQueryBuilder=new MatchQueryBuilder("skuName","Apple");
		boolQueryBuilder.must(matchQueryBuilder);
		//query
		searchSourceBuilder.query(boolQueryBuilder);

		//from
		searchSourceBuilder.from(0);

		//size
		searchSourceBuilder.size(20);
		//hightlighter
		searchSourceBuilder.highlighter();

		String delStr=searchSourceBuilder.toString();
Search search = new Search.Builder("dsl的json語句").addIndex("gmall0105").addType("PmsSkuInfo").build();
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章