Elasticsearch7學(xué)習(xí)筆記(實戰(zhàn))

Elasticsearch7學(xué)習(xí)筆記(上)
Elasticsearch7學(xué)習(xí)筆記(中)
Elasticsearch7學(xué)習(xí)筆記(下)
Elasticsearch7學(xué)習(xí)筆記(實戰(zhàn))

在SpringBoot中集成Elasticsearch,需要添加如下maven依賴:

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>

注意在這里引入es的jar包版本要比elasticsearch版本相等或大于(最好相等),否則可能會出現(xiàn)一些奇奇怪怪的問題。

在application.yml配置文件中添加elasticsearch的配置(可以配置多個)

spring:
  elasticsearch:
    rest:
      uris: http://192.168.111.55:9200

如果沒有什么特殊的配置的話,直接使用springboot自動配置的即可昼接;自定義配置時,可以參考springboot的中配置;

spring文檔:https://docs.spring.io/spring-data/elasticsearch/docs/current/reference/html

示例:查詢以某個字符開頭的數(shù)據(jù)

這里我們實現(xiàn)類似12306查詢站點時的智能提示功能掺逼,即輸入北京會智能顯示北京開頭的站點。下面的示例使用的是webflux

12306火車站點信息數(shù)據(jù)拉取

站點數(shù)據(jù):https://www.12306.cn/index/script/core/common/station_name_v10095.js

數(shù)據(jù)解析程序如下:

private static final String STATION_NAME_URL = "https://www.12306.cn/index/script/core/common/station_name_v10095.js";

 /**
 * 導(dǎo)入站點數(shù)據(jù)
 */
public Mono<String> importTrainStationName() {
    return WebClient.create(STATION_NAME_URL).get().retrieve()
            .onStatus(HttpStatus::is4xxClientError, clientResponse-> Mono.error(new BizException("數(shù)據(jù)拉取失敗")))
            .bodyToMono(String.class)
            .flatMap(body->{
                List<TrainStationName> list = extractStationName(body);
                return Mono.just(batchInsert(list));
            });
}

 /**
 * 提取數(shù)據(jù)
 */
private List<TrainStationName> extractStationName(String str){
    String[] arr = str.split("\\|");
    List<TrainStationName> list = new ArrayList<>();
    for(int i=1; i<arr.length; i++){
        TrainStationName stationName = new TrainStationName();
        stationName.setCnName(arr[i++]);
        stationName.setCode(arr[i++]);
        stationName.setPinyin(arr[i++]);
        stationName.setPinyinShort(arr[i++]);
        list.add(stationName);
    }
    return list;
}

 /**
 * 導(dǎo)入數(shù)據(jù)到庫中
 */
private String batchInsert(List<TrainStationName> list){
    int add = 0;
    int totalPull = list.size();
    for(TrainStationName stationName:list){
        LambdaQueryWrapper<TrainStationName> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(TrainStationName::getCnName, stationName.getCnName());
        TrainStationName stationNameDb = trainStationNameMapper.selectOne(queryWrapper);
        if(stationNameDb==null){
            add++;
            trainStationNameMapper.insert(stationName);
            stationNameDb = stationName;
        }

        if(stationNameDb.getId()!=null){
            boolean exists = trainStationNameRepository.existsById(stationNameDb.getId());
            if(!exists){
                trainStationNameRepository.save(TrainStationNameDTO.cloneTrainStationName(stationNameDb));
            }
        }
    }
    return String.format("共計拉取:%d條數(shù)據(jù)瓤介,新增:%d條數(shù)據(jù)", totalPull, add);
}

站點數(shù)據(jù)pojo

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;

import java.io.Serializable;

@Data
@TableName("train_station_name")
public class TrainStationName implements Serializable {

    @TableId(value = "id", type = IdType.AUTO)
    private Long id;

    /**
     * 三字碼
     */
    @TableField("code")
    private String code;

    /**
     * 拼音
     */
    @TableField("pinyin")
    private String pinyin;

    /**
     * 拼音簡寫
     */
    @TableField("pinyin_short")
    private String pinyinShort;

    /**
     * 中文名稱
     */
    @TableField("cn_name")
    private String cnName;

}

es中的實體類映射

import lombok.Data;
import org.springframework.beans.BeanUtils;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
import top.vchar.train.entity.TrainStationName;

import java.io.Serializable;

@Data
@Document(indexName = "train_station_name")
public class TrainStationNameDTO implements Serializable {

    @Id
    private Long id;

    /**
     * 三字碼
     */
    @Field(type = FieldType.Keyword)
    private String code;

    /**
     * 拼音
     */
    @Field(type = FieldType.Keyword)
    private String pinyin;

    /**
     * 拼音簡寫
     */
    @Field(type = FieldType.Keyword)
    private String pinyinShort;

    /**
     * 中文名稱
     */
    @Field(type = FieldType.Keyword)
    private String cnName;

    public static TrainStationNameDTO cloneTrainStationName(TrainStationName stationName){
        TrainStationNameDTO dto = new TrainStationNameDTO();
        BeanUtils.copyProperties(stationName, dto);
        return dto;
    }
}

es的查詢語句

在不曉得如何在代碼中拼寫語句時吕喘,可以先使用es的查詢語句試哈。之后再敲代碼會清晰許多刑桑。

GET /train_station_name/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "prefix": {
            "cnName.keyword": {
              "value": "beib"
            }
          }
        },
        {
          "match_phrase_prefix": {
            "pinyin": "beib"
          }
        }
      ]
    }
  }
}

Java代碼實現(xiàn)

spring封裝的ElasticsearchRestTemplate實現(xiàn)氯质,沒有特殊查詢時建議直接用spring封裝的工具類

@Autowired
private ElasticsearchRestTemplate elasticsearchRestTemplate;

public Flux<TrainStationNameDTO> findTrainStationName(String keywords) {

    BoolQueryBuilder boolQuery = new BoolQueryBuilder();
    QueryBuilder cnNameQuery = new PrefixQueryBuilder("cnName.keyword", keywords);
    boolQuery.should(cnNameQuery);
    QueryBuilder pinyinQuery = new MatchPhrasePrefixQueryBuilder("pinyin", keywords);
    boolQuery.should(pinyinQuery);
    Query query = new NativeSearchQuery(boolQuery);
    return Flux.fromIterable(elasticsearchRestTemplate.search(query, TrainStationNameDTO.class)).map(SearchHit::getContent);
}

spring封裝的orm框架,做簡單的crud操作時強烈建議就用這種方式祠斧。類似mybatis

@Component
@Document(indexName = "train_station_name")
public interface TrainStationNameRepository extends ElasticsearchRepository<TrainStationNameDTO, Long> {

    /**
     * 查詢以keywords開頭的站點信息
     * @param cnName 中文
     * @param pinyin 拼音
     * @return 返回結(jié)果
     */
    List<TrainStationNameDTO> findByCnNameStartingWithOrPinyinStartingWith(String cnName, String pinyin);

}

最開始的RestHighLevelClient實現(xiàn)

@Autowired
private RestHighLevelClient client;

private void useClient(String keywords) {
    SearchRequest request = new SearchRequest("train_station_name");
    request.source(SearchSourceBuilder.searchSource()
            .query(QueryBuilders.boolQuery()
                    .should(QueryBuilders.prefixQuery("cnName.keyword", keywords))
                    .should(QueryBuilders.matchPhrasePrefixQuery("pinyin", keywords))
            )
    );
    try {
        SearchResponse search = client.search(request, RequestOptions.DEFAULT);
        log.info(JSONObject.toJSONString(search.getHits()));
    } catch (IOException e) {
        e.printStackTrace();
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末闻察,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子琢锋,更是在濱河造成了極大的恐慌辕漂,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吴超,死亡現(xiàn)場離奇詭異钉嘹,居然都是意外死亡,警方通過查閱死者的電腦和手機鲸阻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門跋涣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來缨睡,“玉大人,你說我怎么就攤上這事陈辱〗蹦辏” “怎么了?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵沛贪,是天一觀的道長拾并。 經(jīng)常有香客問我,道長鹏浅,這世上最難降的妖魔是什么嗅义? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮隐砸,結(jié)果婚禮上之碗,老公的妹妹穿的比我還像新娘。我一直安慰自己季希,他們只是感情好褪那,可當(dāng)我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著式塌,像睡著了一般博敬。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上峰尝,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天偏窝,我揣著相機與錄音,去河邊找鬼武学。 笑死祭往,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的火窒。 我是一名探鬼主播硼补,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼熏矿!你這毒婦竟也來了已骇?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤票编,失蹤者是張志新(化名)和其女友劉穎褪储,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體栏妖,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡乱豆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年奖恰,在試婚紗的時候發(fā)現(xiàn)自己被綠了吊趾。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宛裕。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖论泛,靈堂內(nèi)的尸體忽然破棺而出揩尸,到底是詐尸還是另有隱情,我是刑警寧澤屁奏,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布岩榆,位于F島的核電站,受9級特大地震影響坟瓢,放射性物質(zhì)發(fā)生泄漏勇边。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一折联、第九天 我趴在偏房一處隱蔽的房頂上張望粒褒。 院中可真熱鬧,春花似錦诚镰、人聲如沸奕坟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽月杉。三九已至,卻和暖如春抠艾,著一層夾襖步出監(jiān)牢的瞬間苛萎,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工检号, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留首懈,地道東北人。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓谨敛,卻偏偏與公主長得像究履,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子脸狸,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,762評論 2 345