cnyes 如何使用 elasticsearch

50
cnYES 如何使用 Elasticsearch 不只是新聞搜尋引擎 Cara Wang <[email protected]> 1

Upload: szuping-wang

Post on 21-Mar-2017

98 views

Category:

Software


2 download

TRANSCRIPT

cnYES 如何使用 Elasticsearch不只是新聞搜尋引擎Cara Wang <[email protected]>

1

要有資料

1. 所有與新聞相關的資料都要放入 cnYes 的 Elasticsearch

新聞本身

新聞圖片/新聞數據/新聞類別/...

總共 7 張 Table

2. Indexing

規劃資料結構,做 Mapping

把資料寫入 Elasticsearch

Analyzer

2

3

要有資料

1. 所有與新聞相關的資料都要放入 cnYes 的 Elasticsearch

新聞本身

新聞圖片/新聞數據/新聞類別/...

總共 7 張 Table

2. Indexing

規劃資料結構,做 Mapping

把資料寫入 Elasticsearch

Analyzer

Inverted Index

4

5

決定資料結構: Mapping1. 搜尋先覺: 一切以 搜尋 好寫為優先

2. 扁平化 的資料呈現

6

author

決定資料結構: Mapping1. 例子 1: 不扁平的資料呈現 - 資料

{

"newsId": 1,

" ": {

"code": "caraw",

"name": "Cara Wang",

"position": "BE"

},

"status": "actived"

01.

02.

03.

04.

05.

06.

07.

08.

7

"status": "actived"

決定資料結構: Mapping1. 例子 1: 不扁平的資料呈現 - 搜尋

POST /_search

{ "query": { "filtered": { "filter": { "bool": { "must": [{

"term": {

}},{

"nested": {

"path": "author",

"query": {

01.

02.

03.

04.

05.

06.

07.

08.

8

"authorCode": "caraw"

"authorName": "Cara Wang"

"authorPosition": "BE"

決定資料結構: Mapping1. 例子 2: 扁平的資料呈現 - 資料

{

"newsId": 1,

,

,

"status": "actived"

}

01.

02.

03.

04.

05.

06.

07.

9

"status": "actived"

決定資料結構: Mapping1. 例子 2: 扁平的資料呈現 - 搜尋

{

"query": {

"bool": {

"must": [

{

"term": {

}

01.

02.

03.

04.

05.

06.

07.

08.

10

一些關於 Mapping 的小事情

1. 扁不扁平看開發需求

2. 特定欄位需不需要做分析看搜尋需求

name/code/position 需要被分析嗎?

{

"query": {

"bool": {

"must": [

{

"term": {

01.

02.

03.

04.

05.

06.

11

一些關於 Mapping 的小事情

1. 扁不扁平看開發需求

2. 特定欄位需不需要做分析看搜尋需求

name/code/position 需要被分析嗎?

3. 搜尋先覺是否都要屏棄 Nested Type?

Nested 內的屬性是有關聯的

例子: 把姓氏跟名子分開存時,兩者便存在強烈關聯

王思平 !== 陳思平

http://joelabrahamsson.com/elasticsearch-nested-mapping-and-filter/

12

一些關於 Indexing 的小事情

1. 已經上線的資料

不!不!不!

能!能!能!

砍!砍!砍!

2. 如何在重新做 Indexing 時不影響線上搜尋運作?

關鍵: 讓外面怎麼看都是同一個 Index

解決: 建立 Alias

13

14

15

16

17

18

開始搜尋囉!

19

"status": "actived"

Query DSL{

"query": {

"bool": {

"must": [

{

"term": {

}

},

{

01.

02.

03.

04.

05.

06.

07.

08.

09.

10.

20

2330

Query DSL - 全文搜尋

post /_search

{

"query": {

"match": {

"_all": " "

}

}

}

01.

02.

03.

04.

05.

06.

07.

08.

21

2330

Query DSL - 全文搜尋

{

"query": {

"filtered": {

"query": {

"multi_match": {

"query": " ",

"fields": ["title","content"]

}

}

}

01.

02.

03.

04.

05.

06.

07.

08.

09.

10.

22

Query DSL - 全文搜尋

1. 改搜尋台積電試試看

2. 中文斷詞的難處

3. 使用 _analyzer 測試斷詞

curl -XGET localhost:9200/sharing/_analyze -d '台積電'

23

24

Query DSL - 全文搜尋

1. 改搜尋台積電試試看

2. 中文斷詞的難處

3. 使用 _analyzer 測試斷詞

4. 解決中文斷詞: 更改分析方式

使用 IK Analysis for Elasticsearch

https://github.com/medcl/elasticsearch-analysis-ik

curl -XGET localhost:9200/sharing/_analyze?tokenizer=ik_smart -d '台積電'

25

26

Query DSL - 全文搜尋

1. 改搜尋林全試試看

27

28

29

Query DSL - 全文搜尋

1. 改搜尋林全試試看

2. 使用 _analyzer 測試斷詞

地區性的慣用詞

curl -XGET localhost:9200/sharing/_analyze?tokenizer=ik_smart -d '林全'

30

Query DSL - 全文搜尋

1. 改搜尋林全試試看

2. 使用 _analyzer 測試斷詞

地區性的慣用詞

符合使用者搜尋習慣的 字典檔

ik 可以設定自動更新字典檔,無需重啟 Elasticsearch Server

31

32

一些關於 Query DSL 的小事

1. 如何決定哪些詞要被加到字典檔?

Google Analytics 站內搜尋

搜尋後停留的時間極短,或搜尋離開 100%

但要小心,不一定是加字典檔就能解決

33

34

35

一些關於 Query DSL 的小事

1. 如何決定哪些詞要被加到字典檔?

Google Analytics 站內搜尋

搜尋後停留的時間極短,或搜尋離開 100%

但要小心,不一定是加字典檔就能解決

搜尋建議

36

37

一些關於 Query DSL 的小事

1. 如何決定哪些詞要被加到字典檔?

Google Analytics 站內搜尋

搜尋後停留的時間極短,或搜尋離開 100%

但要小心,不一定是加字典檔就能解決

搜尋建議

搜尋優化沒有結束的一天. . .

38

不只是搜尋引擎!

39

"台"

搜尋建議

POST _suggest

{

"suggest" : {

"text" : ,

"completion":{

"field" : "keywordForAutoComplete",

"size": 10

}

}

}

01.

02.

03.

04.

05.

06.

07.

08.

09.

10.

40

41

相關新聞

1. 原本: 同類別下隨機抓取 n 則新聞

2. 修正: 分析內文,取得真正相關的新聞

42

43

44

45

46

相關新聞: 成效

1. 時間區間: 2016/06/07 ~ 2016/06/13

2. 點擊數: 相關新聞的點擊數較其他新聞多了 44%

47

看 code 時間

48

幾件必須做的基礎工程

1. 在 Laravel 中整合 Elasticsearch

Full Re-build: 有機會重新分析資料

Command: php artisan elasticsearch:all --v

Wrapper: 串官方的 library,方便打 API

Synchronization: 即時同步 CMS 新增/修改/刪除 動作

Full Re-build 時,用 Cache 通知同步動作要同時發生在新的與舊的

index

49

Q & A

50