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();
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章