cnyes 如何使用 elasticsearch
TRANSCRIPT
要有資料
1. 所有與新聞相關的資料都要放入 cnYes 的 Elasticsearch
新聞本身
新聞圖片/新聞數據/新聞類別/...
總共 7 張 Table
2. Indexing
規劃資料結構,做 Mapping
把資料寫入 Elasticsearch
Analyzer
2
要有資料
1. 所有與新聞相關的資料都要放入 cnYes 的 Elasticsearch
新聞本身
新聞圖片/新聞數據/新聞類別/...
總共 7 張 Table
2. Indexing
規劃資料結構,做 Mapping
把資料寫入 Elasticsearch
Analyzer
Inverted Index
4
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
"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
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
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
一些關於 Query DSL 的小事
1. 如何決定哪些詞要被加到字典檔?
Google Analytics 站內搜尋
搜尋後停留的時間極短,或搜尋離開 100%
但要小心,不一定是加字典檔就能解決
33
一些關於 Query DSL 的小事
1. 如何決定哪些詞要被加到字典檔?
Google Analytics 站內搜尋
搜尋後停留的時間極短,或搜尋離開 100%
但要小心,不一定是加字典檔就能解決
搜尋建議
36
一些關於 Query DSL 的小事
1. 如何決定哪些詞要被加到字典檔?
Google Analytics 站內搜尋
搜尋後停留的時間極短,或搜尋離開 100%
但要小心,不一定是加字典檔就能解決
搜尋建議
搜尋優化沒有結束的一天. . .
38
"台"
搜尋建議
POST _suggest
{
"suggest" : {
"text" : ,
"completion":{
"field" : "keywordForAutoComplete",
"size": 10
}
}
}
01.
02.
03.
04.
05.
06.
07.
08.
09.
10.
40
幾件必須做的基礎工程
1. 在 Laravel 中整合 Elasticsearch
Full Re-build: 有機會重新分析資料
Command: php artisan elasticsearch:all --v
Wrapper: 串官方的 library,方便打 API
Synchronization: 即時同步 CMS 新增/修改/刪除 動作
Full Re-build 時,用 Cache 通知同步動作要同時發生在新的與舊的
index
49