下載安裝
https://www.elastic.co/downloads/past-releases 官網(wǎng)的現(xiàn)在下載頁面。進(jìn)入以后選擇對應(yīng)的產(chǎn)品和版本進(jìn)行下載。
不要打開中文版,幾乎所有鏈接都會定位到廣告頁面,無法獲取有用信息。
截止2019-05-10,最新的java版本的ES依賴只支持到6.x,而最新版本的ES已經(jīng)到7.x。要注意版本對應(yīng),否則java和ES交互的時候會報(bào)錯,版本不兼容。

啟動
? 下載并解壓完畢以后,會出現(xiàn)elasticsearch-6.4.3文件夾,點(diǎn)擊bin/elasticsearch.bat啟動ES。啟動完成以后,訪問http://localhost:9200/,出現(xiàn)以下JSON即為啟動安裝成功。
{
"name": "0Fj5Yyx",
"cluster_name": "elasticsearch",
"cluster_uuid": "qRoTkxTESm6FZ0jGI-9UcQ",
"version": {
"number": "6.4.3",
"build_flavor": "default",
"build_type": "zip",
"build_hash": "fe40335",
"build_date": "2018-10-30T23:17:19.084789Z",
"build_snapshot": false,
"lucene_version": "7.4.0",
"minimum_wire_compatibility_version": "5.6.0",
"minimum_index_compatibility_version": "5.0.0"
},
"tagline": "You Know, for Search"
}
分詞器安裝
什么是分詞器
? 分詞器是將存儲進(jìn)去的文檔進(jìn)行短語拆分處理,用來作為查詢索引。比如要在es中存儲“人民幣”,默認(rèn)的分詞器會將這個詞語進(jìn)行拆分,分為“人”,“民”,“幣”。查詢時輸入“人”,“民”,“幣”三者中的一者都會關(guān)聯(lián)出“人民幣”這個內(nèi)容。
為什么需要自定義分詞器
? 原生的分詞器對于中文的分詞支持不是很好。原生中文不支持短語分詞,而是將中文一個一個的拆分。比如:“人民幣”,原生的分詞器會將其分為“人”,“民”,“幣”。這時你只想查詢?nèi)讼嚓P(guān)信息的時候,“人民幣”也會被關(guān)聯(lián)出來。索引出了很多相關(guān)不大的結(jié)果,降低了查詢質(zhì)量。
比較好的中文分詞器
IK分詞器(https://github.com/medcl/elasticsearch-analysis-ik)。
該分詞器的作者之前所屬公司是醫(yī)療行業(yè),為了公司商品還有其他一些查詢需要,用了ES進(jìn)行檢索。當(dāng)時也是受限于原生分詞器對中文支持不好的詬病,遂自己實(shí)現(xiàn)了一套分詞器。
安裝IK分詞器
在https://github.com/medcl/elasticsearch-analysis-ik/releases 頁面中下載對應(yīng)ES版本的分詞器,將其解壓放在$ES_HOME/plugin/ik目錄下,重啟es,分詞器插件就自動加載了。
小結(jié):
至此ES安裝告一段落,目前啟動依靠的還是默認(rèn)配置,IK分詞器也可以自定義分詞,這些留著后面研究。
java客戶端
? 1. 首先導(dǎo)入Maven依賴:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
<version>2.1.4.RELEASE</version>
</dependency>
- 在
SpringBoot啟動類上加上@EnableElasticsearchRepositories注解,裝配ES的核心類 - 創(chuàng)建一個商品類:
GoodsInfo
@Data
@ToString
@NoArgsConstructor
@AllArgsConstructor
@Document(indexName = "products",type = "good", shards = 1,replicas = 0)
public class GoodsInfo implements Serializable {
@Id
private Long id;
@Field(type = FieldType.Keyword)
private String name;
@Field(type = FieldType.Text, analyzer = "ik_max_word")
private String description;
}
注:
@Document是ES的注解,將此實(shí)體類標(biāo)注成一個文檔:
indexName: 索引名稱,相當(dāng)于數(shù)據(jù)庫
type: 類型, 相當(dāng)于表
shards: 分片數(shù)量
replicas: 副本數(shù)量
@Id作用在成員變量,標(biāo)記一個字段作為id主鍵
@Field作用在成員變量,標(biāo)記為文檔的字段,并指定字段映射屬性:
type:字段類型,是枚舉:FieldType,可以是text、long、short、date、integer、object等
analyzer: 分詞器名稱,這里的ik_max_word即使用ik分詞器
創(chuàng)建DAO層:
@Component
public interface GoodsRepository extends ElasticsearchRepository<GoodsInfo,Long> {
}
創(chuàng)建Controller層:
@RestController
public class GoodsController {
//每頁數(shù)量
private Integer PAGESIZE = 10;
@Autowired
private GoodsRepository goodsRepository;
//http://localhost:8888/save
@GetMapping("save")
public String save(@RequestBody GoodsInfo goodsInfo) {
goodsInfo.setId(System.currentTimeMillis());
goodsRepository.save(goodsInfo);
return "success";
}
//http://localhost:8888/delete?id=1525415333329
@GetMapping("delete")
public String delete(long id) {
goodsRepository.deleteById(id);
return "success";
}
//http://localhost:8888/update?id=1525417362754&name=修改&description=修改
@GetMapping("update")
public String update(long id, String name, String description) {
GoodsInfo goodsInfo = new GoodsInfo(id,
name, description);
goodsRepository.save(goodsInfo);
return "success";
}
//http://localhost:8888/getOne?id=1525417362754
@GetMapping("getOne")
public GoodsInfo getOne(long id) {
Optional<GoodsInfo> goodsInfo = goodsRepository.findById(id);
return goodsInfo.get();
}
//http://localhost:8888/getGoodsList?query=商品
//http://localhost:8888/getGoodsList?query=商品&pageNumber=1
//根據(jù)關(guān)鍵字"商品"去查詢列表,name或者description包含的都查詢
@GetMapping("getGoodsList")
public List<GoodsInfo> getList(Integer pageNumber, String query) {
if (pageNumber == null) {
pageNumber = 0;
}
//es搜索默認(rèn)第一頁頁碼是0
SearchQuery searchQuery = getEntitySearchQuery(pageNumber, PAGESIZE, query);
Page<GoodsInfo> goodsPage = goodsRepository.search(searchQuery);
return goodsPage.getContent();
}
private SearchQuery getEntitySearchQuery(int pageNumber, int pageSize, String searchContent) {
FunctionScoreQueryBuilder functionScoreQueryBuilder = QueryBuilders.functionScoreQuery(QueryBuilders.matchPhraseQuery("name", searchContent));
// 設(shè)置分頁
Pageable pageable = new PageRequest(pageNumber, pageSize);
return new NativeSearchQueryBuilder()
.withPageable(pageable)
.withQuery(functionScoreQueryBuilder).build();
}
}
在properties文件中指定ES的api地址:
spring.data.elasticsearch.cluster-nodes=127.0.0.1:9300