核心數據類型
字符串型:text、keyword
數值型:long、integer、short、byte、double、float、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即可
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的整合
- 導入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();