ES的安裝

下載安裝

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)錯,版本不兼容。


image.png

啟動

? 下載并解壓完畢以后,會出現(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>
  1. SpringBoot啟動類上加上@EnableElasticsearchRepositories注解,裝配ES的核心類
  2. 創(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

引用參考鏈接:

https://blog.csdn.net/chen_2890/article/details/83895646

http://www.itdecent.cn/p/914f102bc174

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容