Elasticsearch ã·ãªãŒãº
å 容 ãªã³ã¯ Elasticsearch åºæ¬æäœ https://blog.yexca.net/ja/archives/226 Elasticsearch ã¯ãšãªæäœ ãã®èšäº RestClient åºæ¬æäœ https://blog.yexca.net/ja/archives/228 RestClient ã¯ãšãªæäœ https://blog.yexca.net/ja/archives/229 Elasticsearch ããŒã¿éèš https://blog.yexca.net/ja/archives/231 Elasticsearch ãªãŒãã³ã³ããªãŒã https://blog.yexca.net/ja/archives/232 Elasticsearch ããŒã¿åæ https://blog.yexca.net/ja/archives/234 Elasticsearch ã¯ã©ã¹ã¿ãŒ https://blog.yexca.net/ja/archives/235
ååã®èšäºã§ã¯äž»ã«ESã®ããŒã¿ä¿åæ©èœã«ã€ããŠè©±ãããã©ãESãäžçªåŸæãªã®ã¯ãã£ã±ãæ€çŽ¢ãšããŒã¿åæãªãã ã
ESã®ã¯ãšãªãçžå€ãããJSON圢åŒã®DSLã§å®è£ ãããã
ã¯ãšãªã®åé¡
ããããã¯ãšãªã®çš®é¡ã¯ãããªæãã
- å
šä»¶æ€çŽ¢: å
šãŠã®ããŒã¿ãæ€çŽ¢ãããã€ãã ããããã¹ãã§äœ¿ãããäŸ:
match_all - å
šææ€çŽ¢ (full text) ã¯ãšãª: ã¢ãã©ã€ã¶ãŒã䜿ã£ãŠãŠãŒã¶ãŒå
¥åã®å
容ãåãã¡æžãããŠã転眮ã€ã³ããã¯ã¹ããããããããã®ãæ¢ãããäŸ:
match_querymulti_match_query
- å³å¯æ€çŽ¢: æ£ç¢ºãªã¿ãŒã å€ã«åºã¥ããŠããŒã¿ãæ€çŽ¢ãããã€ãã ããã
keywordãæ°å€ãæ¥ä»ãbooleanãªã©ã®ãã£ãŒã«ãã¿ã€ããæ¢ãæã«äœ¿ãããäŸ:idsrangeterm
- å°çæ
å ± (geo) ã¯ãšãª: 緯床çµåºŠã«åºã¥ããŠæ€çŽ¢ãããã€ãäŸ:
geo_distancegeo_bounding_box
- è€åã¯ãšãª (compound): äžèšã®ç°¡åãªã¯ãšãªæ¡ä»¶ãçµã¿åãããŠãæ€çŽ¢æ¡ä»¶ããŸãšãããã€ãäŸ:
boolfunction_score
ã¯ãšãªã®ææ³ã¯ã ãããåãã ã:
| |
å šä»¶æ€çŽ¢
ã¯ãšãªã¿ã€ã㯠match_all ã§ãæ€çŽ¢æ¡ä»¶ã¯ãªããã
| |
å šææ€çŽ¢ã¯ãšãª
ãŠãŒã¶ãŒã®å
¥åå
容ãåãã¡æžãããããæ€çŽ¢ããã¯ã¹ã§ã®æ€çŽ¢ã«ãã䜿ãããããã¿ãŒã ã䜿ã£ãŠãããããããããæ€çŽ¢å¯Ÿè±¡ã®ãã£ãŒã«ãã¯åãã¡æžãã§ãã text ã¿ã€ããããªããšãããªããã ã
ããããã®ã¯:
match: åäžãã£ãŒã«ãæ€çŽ¢multi_match: è€æ°ãã£ãŒã«ãæ€çŽ¢ãã©ããäžã€ã®ãã£ãŒã«ããæ¡ä»¶ã«åãã°æ€çŽ¢æ¡ä»¶ã«åããšã¿ãªããããã
match ã¯ãšãªã®ææ³:
| |
multi_match ã®ææ³
| |
以åã€ã³ããã¯ã¹ãäœæããæã«ã
brandãnameãbusinessã®å€ãcopy_toã䜿ã£ãŠallãã£ãŒã«ãã«ã³ããŒãããããäžèšã®2ã€ã®ã¯ãšãªã®çµæã¯åãã«ãªãããã§ããæ€çŽ¢ãã£ãŒã«ããå¢ããã°å¢ããã»ã©ããã©ãŒãã³ã¹ãžã®åœ±é¿ã倧ãããªãããã
copy_toã䜿ã£ãŠãåäžãã£ãŒã«ãã§æ€çŽ¢ããã®ãããããã ãã
å³å¯æ€çŽ¢
å³å¯æ€çŽ¢ã¯æ€çŽ¢æ¡ä»¶ãåãã¡æžãããªãããããããã®ã¯:
term: ã¿ãŒã ã®å³å¯ãªå€ã«åºã¥ããŠæ€çŽ¢range: å€ã®ç¯å²ã«åºã¥ããŠæ€çŽ¢
term ã¯ãšãª
æ€çŽ¢æ¡ä»¶ã¯åãã¡æžããããªãã¿ãŒã ãããªããšãããªãããå ¥åå€ãšå®å šã«äžèŽããå Žåã«ã®ã¿æ¡ä»¶ã«åããã ã
ææ³:
| |
äŸ
| |
range ã¯ãšãª
ç¯å²æ€çŽ¢ã ããã ãããæ°å€ã¿ã€ãã®ç¯å²ã§çµã蟌ã¿ãããæã«äœ¿ãããäŸãã°ãäŸ¡æ Œãæ¥ä»ã®ç¯å²ã§ãã£ã«ã¿ãªã³ã°ããæãšãã
ææ³:
| |
äŸ
| |
å°ç座æšã¯ãšãª
ããã¯èŠããã«ç·¯åºŠçµåºŠã«åºã¥ããŠæ€çŽ¢ãããã€ã ããå ¬åŒããã¥ã¡ã³ãã¯ãã¡ã: https://www.elastic.co/guide/en/elasticsearch/reference/current/geo-queries.html
ããããã·ãŒã³: åšå²ã®ããã«ãã¿ã¯ã·ãŒã人ãã°ã«ã¡ãæ€çŽ¢ããæãšãã
ç©åœ¢ç¯å²æ€çŽ¢
geo_bounding_box ã¯ãšãªãç¹å®ã®ç©åœ¢ç¯å²å
ã«ãã座æšãæã€å
šãŠã®ããã¥ã¡ã³ããæ€çŽ¢ãããã
å·Šäžãšå³äžã®2ã€ã®ç¹ã®åº§æšãæå®ããå¿ èŠããããã ã
| |
è¿é£æ€çŽ¢
è·é¢æ€çŽ¢ (geo_distance) ãšãåŒã°ããããæå®ããäžå¿ç¹ããç¹å®ã®è·é¢ä»¥å
ã«ããå
šãŠã®ããã¥ã¡ã³ããæ€çŽ¢ãããã
| |
äŸ: åšå² (31.21, 121.5) ã®15km以å ã«ããããã«ãæ€çŽ¢ãããã
| |
è€åã¯ãšãª
ä»ã®ã·ã³ãã«ãªã¯ãšãªãçµã¿åãããŠãããè€éãªæ€çŽ¢ããžãã¯ãå®çŸãããã ãããããã®ã¯2çš®é¡:
function score: ã¹ã³ã¢èšç®é¢æ°ã¯ãšãªãããã¥ã¡ã³ãã®é¢é£æ§ã¹ã³ã¢ãå¶åŸ¡ããŠãããã¥ã¡ã³ãã®ã©ã³ãã³ã°ã調æŽã§ããããbool query: ããŒã«ã¯ãšãªãè«çé¢ä¿ã䜿ã£ãŠè€æ°ã®ä»ã®ã¯ãšãªãçµã¿åãããè€éãªæ€çŽ¢ãå®çŸãããã
é¢é£æ§ã¹ã³ã¢
match ã¯ãšãªã䜿ããšãããã¥ã¡ã³ãã®çµæã¯æ€çŽ¢ã¿ãŒã ãšã®é¢é£åºŠã«åºã¥ããŠã¹ã³ã¢ (_score) ãã€ããããŠãçµæã¯ã¹ã³ã¢ã®é«ãé ã«äžŠãã§è¿ã£ãŠãããã ããããªæã:
| |
ESã§ã¯ãåæã«ã¯TF-IDFã¢ã«ãŽãªãºã ãã¹ã³ã¢èšç®ã«äœ¿ãããŠãããã ã

TF-IDFã¢ã«ãŽãªãºã ã«ã¯æ¬ ç¹ããã£ãŠãã¿ãŒã ã®é »åºŠãé«ããªãã»ã©ããã¥ã¡ã³ãã®ã¹ã³ã¢ãé«ããªã£ãŠãåäžã®ã¿ãŒã ãããã¥ã¡ã³ãã«äžãã圱é¿ã倧ãããããã ã5.1ããŒãžã§ã³ä»¥éã¯ãã¢ã«ãŽãªãºã ãBM25ã¢ã«ãŽãªãºã ã«å€ãããåäžã®ã¿ãŒã ã®ã¹ã³ã¢ã«ã¯äžéãèšããããããã«ãªã£ããã

ã¹ã³ã¢èšç®é¢æ°ã¯ãšãª
ã¹ã³ã¢èšç®é¢æ°ã¯ããªãåççã ãã©ããããã¯ããæ±ããŠãããã®ãšå¿
ãããäžèŽãããšã¯éããªããã ãé¢é£æ§ã¹ã³ã¢ãå¶åŸ¡ãããå Žåã¯ãESã® function_score ã¯ãšãªã䜿ã£ãŠãããã¥ã¡ã³ãã®é¢é£æ§ã¹ã³ã¢ã倿Žããæ°ããåŸãããã¹ã³ã¢ã«åºã¥ããŠãœãŒãããå¿
èŠããããã
æ§é :
| |
å ã®ã¯ãšãª: ãã®æ¡ä»¶ã«åºã¥ããŠããã¥ã¡ã³ããæ€çŽ¢ããBM25ã¢ã«ãŽãªãºã ã«åºã¥ããŠããã¥ã¡ã³ãã«ã¹ã³ã¢ãã€ãããããããå ã®ã¹ã³ã¢ (query score) ã ãã
ãã£ã«ã¿æ¡ä»¶: ãã®æ¡ä»¶ã«åèŽããããã¥ã¡ã³ãã®ã¿ãåã¹ã³ã¢ãªã³ã°ããããã
ã¹ã³ã¢èšç®é¢æ°: ãã£ã«ã¿æ¡ä»¶ã«åèŽããããã¥ã¡ã³ãã¯ããã®é¢æ°ã«åºã¥ããŠèšç®ãããŠã颿°ã¹ã³ã¢ãåŸããããã ã4çš®é¡ã®é¢æ°ãããã:
weight: 颿°ã®çµæã宿°ã«ãªããfield_value_factor: ããã¥ã¡ã³ãå ã®ç¹å®ã®ãã£ãŒã«ãå€ã颿°ã®çµæãšããŠäœ¿ããrandom_score: ä¹±æ°ã颿°ã®çµæãšããŠäœ¿ããscript_score: ã«ã¹ã¿ã ã®ã¹ã³ã¢èšç®é¢æ°ã¢ã«ãŽãªãºã ã
æŒç®ã¢ãŒã: ã¹ã³ã¢èšç®é¢æ°ã®çµæãšãå ã®ã¯ãšãªã®é¢é£æ§ã¹ã³ã¢ã®éã®æŒç®æ¹æ³ããããªæã:
multiply: ä¹ç®replace:function scoreã§query scoreã眮ãæãã- ãã®ä»ã
sumãavgãmaxãminãªã©
äŸ: ãåŠå®¶ããšãããã©ã³ãã®ããã«ãäžäœã«è¡šç€ºããããã
| |
ããŒã«ã¯ãšãª
ããŒã«ã¯ãšãªã¯äžã€ãŸãã¯è€æ°ã®ã¯ãšãªå¥ã®çµã¿åããã§ãããããã®å¥ããµãã¯ãšãªã«ãªã£ãŠãããã ãçµã¿åããæ¹ã¯ãããªæã:
must: åãµãã¯ãšãªã«å¿ ããããããå¿ èŠãããããANDãã¿ãããªãã®ã ããshould: ãµãã¯ãšãªã«éžæçã«ãããããããORãã¿ãããªãã®ã ããmust_not: å¿ ããããããªãããšãã¹ã³ã¢èšç®ã«ã¯åå ããªãããNOTãã¿ãããªãã®ã ããfilter: å¿ ããããããããšãã¹ã³ã¢èšç®ã«ã¯åå ããªãã
äŸãã°ãããã«ãæ€çŽ¢ããæã«ãå°åããã©ã³ããäŸ¡æ Œãªã©ã®ãã£ãŒã«ãã§çµã蟌ã¿ããå Žåãããããã®ãã£ãŒã«ãã§æ€çŽ¢æ¡ä»¶ãæ¹æ³ãéããããè€æ°ã®ç°ãªãã¯ãšãªãå¿
èŠã«ãªããããããããçµã¿åãããã«ã¯boolã¯ãšãªã䜿ããã ã
ã¹ã³ã¢èšç®ã«åå ãããã£ãŒã«ãã¯ãæ€çŽ¢ããã©ãŒãã³ã¹ãæªããªããã倿¡ä»¶æ€çŽ¢ã®æã¯ã次ã®ããšãããããããã:
- æ€çŽ¢ããã¯ã¹ã®ããŒã¯ãŒãæ€çŽ¢ã¯å
šææ€çŽ¢ã ããã
mustã¯ãšãªã䜿ã£ãŠãã¹ã³ã¢èšç®ã«åå ãããã - ãã®ä»ã®ãã£ã«ã¿æ¡ä»¶ã¯ã
filterã¯ãšãªã䜿ã£ãŠãã¹ã³ã¢èšç®ã«ã¯åå ãããªãã
ææ³:
| |
äŸ: ååããåŠå®¶ããå«ã¿ãäŸ¡æ Œã400以äžã§ãåº§æš (31.21, 121.5) ã®åšå²10km以å ã«ããããã«ãæ€çŽ¢ãããã
| |
æ€çŽ¢çµæã®åŠç
æ€çŽ¢ã§åŸãããçµæã¯ããœãŒããããŒãžããŒã·ã§ã³ããã€ã©ã€ããã§ãããã
ãœãŒã
ESã¯ããã©ã«ãã§ã¯é¢é£æ§ã¹ã³ã¢ã«åºã¥ããŠãœãŒããããã©ãã«ã¹ã¿ã æ¹åŒã§æ€çŽ¢çµæããœãŒãããããšãã§ãããã ããœãŒãã§ãããã£ãŒã«ãã¿ã€ãã¯ãkeyword ã¿ã€ããæ°å€ã¿ã€ããå°ç座æšã¿ã€ããæ¥ä»ã¿ã€ããªã©ããããã
éåžžãã£ãŒã«ãã®ãœãŒã
keywordãæ°å€ãæ¥ä»ã¿ã€ãã®ãœãŒãã®ææ³ã¯ã ãããåãã ãã
ææ³:
| |
ãœãŒãæ¡ä»¶ã¯é åã«ãªã£ãŠããŠãè€æ°ã®ãœãŒãæ¡ä»¶ãæžãããã宣èšãããé ã«ãæåã®æ¡ä»¶ãåãå Žåã¯2çªç®ã®æ¡ä»¶ã§ããšããããã«ç¶ããã ã
äŸ: ããã«ããŒã¿ããŠãŒã¶ãŒè©äŸ¡ã®éé ã§ãè©äŸ¡ãåãå Žåã¯äŸ¡æ Œã®æé ã§ãœãŒããããã
| |
å°ç座æšãœãŒã
ææ³:
| |
äŸ: ããã«ãè·é¢ã§ãœãŒãããã (äœçœ®ã 31.034661, 121.612282 ãšä»®å®ããã)ã
é«åŸ³ã§ç·¯åºŠçµåºŠãååŸããã«ã¯ãã: https://lbs.amap.com/demo/jsapi-v2/example/map/click-to-get-lnglat/
| |
ããŒãžããŒã·ã§ã³
ESã¯ããã©ã«ãã§Top10ã®ããŒã¿ããè¿ããªãããããã£ãšå€ãã®ããŒã¿ãæ€çŽ¢ãããå Žåã¯ããŒãžããŒã·ã§ã³ã®ãã©ã¡ãŒã¿ã倿Žããå¿
èŠãããããES㯠fromãsize ãã©ã¡ãŒã¿ã倿ŽããŠãè¿åŽããããŒãžã³ã°çµæãå¶åŸ¡ãããã :
from: äœçªç®ã®ããã¥ã¡ã³ãããå§ãããsize: åèšã§ããã€ã®ããã¥ã¡ã³ããæ€çŽ¢ããã
MySQLã®
limit ?,?ã¿ãããªãã®ã ãã
åºæ¬ããŒãžããŒã·ã§ã³
åºæ¬çãªææ³ã¯ä»¥äžã®éãã ãã
| |
ãã£ãŒãããŒãžããŒã·ã§ã³ã®åé¡
ãã990ã1000çªç®ã®ããŒã¿ãæ€çŽ¢ããããªããã¯ãšãªã¯ãããªããã
| |
ã§ãESã®ä»çµã¿äžãããŒãžããŒã·ã§ã³ããæã¯ãŸã0ã1000ä»¶ãæ€çŽ¢ããŠããããã990ã1000ä»¶ç®ãåãåã£ãŠè¡šç€ºãããã ã
ESãã·ã³ã°ã«ããŒãã¢ãŒããªã倧ããªåœ±é¿ã¯ãªããã©ãã¯ã©ã¹ã¿ãŒæ§æã§ãããã€ãããŠããå Žåã1000ä»¶æ€çŽ¢ãããããšãã£ãŠåããŒãã200ä»¶ãã€æ€çŽ¢ãããããããªããã ããªããªããAããŒãã®200ä»¶ãBããŒãã§ã¯1000äœä»¥äžã«ãªãå¯èœæ§ããããããã
äžäœ1000ä»¶ãååŸããããã«ã¯ãåããŒããTop1000ãæ€çŽ¢ãããããããŸãšããŠåã©ã³ãã³ã°ããŠåãåãå¿ èŠããããã ã
ããTop10000ããããã¯ãã以äžãæ€çŽ¢ããããšãããšãã¡ã¢ãªãšCPUã«éåžžã«å€§ããªè² è·ãããããããES㯠from + size ã10000ãè¶
ãããªã¯ãšã¹ããçŠæ¢ããŠãããã
ãã£ãŒãããŒãžããŒã·ã§ã³ã«å¯ŸããŠã¯ãESã2ã€ã®è§£æ±ºçãæäŸããŠããã: https://www.elastic.co/guide/en/elasticsearch/reference/current/paginate-search-results.html
search after: ããŒãžããŒã·ã§ã³æã«ãœãŒããå¿ èŠã§ãåçã¯ååã®ãœãŒãå€ããæ¬¡ã®ããŒãžã®ããŒã¿ãæ€çŽ¢ãããã ãå ¬åŒãæšå¥šããæ¹æ³ã ããscroll: åçã¯ãœãŒããããããã¥ã¡ã³ãIDã®ã¹ãããã·ã§ãããã¡ã¢ãªã«ä¿åãããã ãã©ãå ¬åŒã¯ããæšå¥šããŠããªããã
ããŒãžããŒã·ã§ã³ãŸãšã
from + size:- å©ç¹: ã©ã³ãã ãªããŒãžç§»åããµããŒãããŠãããã
- æ¬ ç¹: ãã£ãŒãããŒãžããŒã·ã§ã³ã®åé¡ãããã®ãšãããã©ã«ãã®æ€çŽ¢äžé (
from + size) ã10000ãªãã ã - 䜿ãã·ãŒã³: çŸåºŠã京æ±ãGoogleãæ·å®ã¿ãããªã©ã³ãã ãªããŒãžç§»åãããæ€çŽ¢ã ãã
after search:- å©ç¹: æ€çŽ¢äžéããªãã (1åã®æ€çŽ¢ã§
sizeã10000ãè¶ ããªããã°ã)ã - æ¬ ç¹: 次ã®ããŒãžãžé 次æ€çŽ¢ããã ãã§ãã©ã³ãã ãªããŒãžç§»åã¯ã§ããªããã ã
- 䜿ãã·ãŒã³: ã©ã³ãã ãªããŒãžç§»åãå¿ èŠãªãæ€çŽ¢ãäŸãã°ã¹ããã§äžã«ã¹ã¯ããŒã«ããããŒãžç§»åãšãã
- å©ç¹: æ€çŽ¢äžéããªãã (1åã®æ€çŽ¢ã§
scroll:- å©ç¹: æ€çŽ¢äžéããªãã (1åã®æ€çŽ¢ã§
sizeã10000ãè¶ ããªããã°ã)ã - æ¬ ç¹: äœåãªã¡ã¢ãªæ¶è²»ãããããæ€çŽ¢çµæã¯ãªã¢ã«ã¿ã€ã ãããªããã ã
- 䜿ãã·ãŒã³: 倧éã®ããŒã¿ååŸãç§»è¡ãES7.1ããã¯éæšå¥šã«ãªã£ãŠãŠã
after searchãããããã ãã
- å©ç¹: æ€çŽ¢äžéããªãã (1åã®æ€çŽ¢ã§
ãã€ã©ã€ã
æ€çŽ¢ãšã³ãžã³ã§ã³ã³ãã³ããæ€çŽ¢ããæãããŒã¯ãŒããèµ€è²ã«ãªã£ãŠç®ç«ã€ããšããããããããããã€ã©ã€ã衚瀺ã§ãéåžžã¯ããã¥ã¡ã³ãå
ã®å
šãŠã®ããŒã¯ãŒãã« <em> ã¿ã°ã远å ããŠããã®ã¿ã°ã«CSSã¹ã¿ã€ã«ãèšå®ãããã ã
ææ³:
| |
泚æç¹:
- ãã€ã©ã€ãã¯ããŒã¯ãŒãã«å¯ŸããŠè¡ããããããæ€çŽ¢æ¡ä»¶ã«ã¯ããŒã¯ãŒããå¿ èŠã§ãç¯å²æ€çŽ¢ã¯ã§ããªããã
- ããã©ã«ãã§ã¯ããã€ã©ã€ããããã£ãŒã«ãã¯æ€çŽ¢ã§æå®ãããã£ãŒã«ããšäžèŽããŠããå¿ èŠããããããããããªããšãã€ã©ã€ããããªããã ã
- æ€çŽ¢å¯Ÿè±¡ã§ã¯ãªããã£ãŒã«ãããã€ã©ã€ããããå Žåã¯ã
required_field_match=falseãšããããããã£ã远å ããå¿ èŠããããã
äŸ: æ€çŽ¢çµæã§ãååã®éšåããã€ã©ã€ããããã
| |
çµæã® highlight éšåã«ãã¿ã°ã远å ãããåŸã®çµæã衚瀺ãããŠãããã
æ€çŽ¢çµæåŠçã®ãŸãšã
DSLã¯ãšãªã¯å€§ããªJSONãªããžã§ã¯ãã§ã以äžãå«ãã:
query: ã¯ãšãªfromãsize: ããŒãžããŒã·ã§ã³æ¡ä»¶sort: ãœãŒãæ¡ä»¶highlight: ãã€ã©ã€ãæ¡ä»¶
ç·åçãªäŸ
| |