
ElasticSearchをインストールして、データを作成してみたので、今度は検索方法をチェックしてみます。MySQLと違って、APIにJsonを投げて「Query DSLというもの」、返り値をJsonで得るという手法です。Apache Solrと同じような感じですね。ブラウザでURLを叩いてCallしても不便なので、kibanaの「Dev Tool」から試してみます。
すべてのドキュメントを取得してみる (match_all)
MySQLに置き換えると、「select * from db_name.table_name」というやつです。MySQL Workbenchなどでは、デフォルトでlimit を決められていますが、ElasticSearchも同様でデフォルト数が決められています。デフォルト数は、10レコードです
///type_nameの中に入ってるドキュメントを探す場合
///MySQLでいうところの
///select * from db_name.table_name
GET /{index_name}/{type_name}/_search
{
"query": {
"match_all": {}
}
}
///index_name全体に入ってるドキュメントを探す場合
GET /{index_name}/_search
{
"query": {
"match_all": {}
}
}
indexの中すべてを横断検索できるのはいいですね。MySQLはできなかったような気がしますね。
10レコードと言われると、色々考えてしまうのがMySQLでいうところのoffsetのところ。
取得レコード数とスキップする件数を指定してを取得してみる (size,from)
MySQLでいうところのlimitは、ElasticSearchでは、fromとsizeで指定します。
///10件スキップした後、20件を取得する
///MySQLでいうところの
///select * from db_name.table_name limit 10,20
GET /{index_name}/{type_name}/_search
{
"query": {
"match_all": {}
},
"from":10,
"size":20
}
queryと同じ位置の並列で記載します。
となると、今度は並び順が気になってきます。MySQLでいうところの「order by」ですね。
特定のカラム(_source)の並び順を指定して、取得してみる (sort)
///_id で昇順ソートした後、10件スキップした後、20件を取得する
///MySQLでいうところの
///select * from db_name.table_name order by _id asc limit 10,20
GET /{index_name}/{type_name}/_search
{
"query": {
"match_all": {}
},
"from":10,
"size":20,
"sort":{"_id":"asc"}
}
///第二のsort条件をつける場合、sortの部分を配列にする。
///updatedを第一、_idを第二にしてみる。
///MySQLでいうところの
///select * from db_name.table_name order by updated asc, _id asc limit 10,20
GET /{index_name}/{type_name}/_search
{
"query": {
"match_all": {}
},
"from":10,
"size":20,
"sort":[{"updated":"asc","_id":"asc"}]
}
ちなみに、他のカラムで実行したところ、「Fielddata is disabled on text fields by default. Set fielddata=true on [{type_name}] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory. Alternatively use a keyword field instead.」というエラーが発生します。
私のElasticSearchのバージョンは6.8.4なのですが、このバージョンではmappingした際、Fiedldataが有効になっていないので、ソートできないようです。つまり、sortできるのはfielddataをtrueにして作成しないといけないようです。
Mysqlでいうところのindexかかってないところでsortするなよってことなのでしょうか。
今度は、取得する際に全カラムいらないんだけど。。。となってきますね。全部取得すると重いですし、カラムを指定して取得してみます。
特定のカラムを指定してを取得する(_source)
上記にも使ったupdatedと、titleというカラムを指定して取得してみます
///updatedで昇順し、さらに_id で昇順ソートした後、titleとupdatedを、10件スキップした後、20件を取得する
///MySQLでいうところの
///select title,updated from db_name.table_name order by updated asc,_id asc limit 10,20
GET /{index_name}/{type_name}/_search
{
"query": {
"match_all": {}
},
"from":10,
"size":20,
"sort":[{"updated":"asc","_id":"asc"}],
"_source":["title","updated"]
}
複数条件を組み合わせて検索する (where ~ AND,OR)
複数条件をつけての検索は、bool検索を使うらしい。で、mustはAND(マッチスコアを考慮)、filterもAND(スコア無視),shouldはOR,must_notは否定のNOTらしい。
以下サンプル
///以下はrangeで数値の範囲なども指定してみました。
//Mysqlでいうところの
//select * from db_name.table_name
//where animal_name="cat" and description like "%トラ模様%"
//and pageview>=100 and pageview<=2000 order by favorite_count desc
GET /{index_name}/{type_name}/_search
{
"query": {
"bool": {
"must": [
{
"term": {
"animal_name": "cat"
}
},
{
"match":{
"description":"トラ模様"
}
},
{
"range":{
"pageview":{
"gte":100,
"lte": 200
}
}
}
]
}
},
"sort":{
"favorite_count":"desc"
}
}
mustとshouldを組み合わせて検索する (where ~ AND,OR)
さらにちょっと複雑なクエリを試してみます
///MySQLでいうところの
//select * from db_name.table_name
//where animal_name="cat" and (title like "%ペットホテル%" or description like "%ペットホテル%")
//order by pageview desc
GET /{index_name}/{type_name}/_search
{
"query": {
"bool": {
"must":[
{
"bool":
{
"must": {
"term": {
"animal_name": "cat"
}
}
}
},
{
"bool": {
"should":[{
"match_phrase":{
"title":"ペットホテル"
}},
{"match_phrase":{
"description":"ペットホテル"
}
}]
}
}]
}
},
"sort":{
"pageview":"desc"
}
}
同じカテゴリの記事
コメント
https://xn--ghq10gmvi961at1bmail479e.com/
https://xn--hoya-8h5gx1jhq2b.tw/
https://xn--uis74a0us56agwe20i.com/
https://9jgirl.live/
https://xn--ghq10gmvi.com/
https://casinoreview.com.tw
私たちはあなたを私たちのオンラインストアで大きなセールに招待することを急いでいます。
ユニークな割引や毎日のプロモーションがあなたを待っています!
<a href=https://bestselldh.pro> ユニークなリンクを使用して、今すぐ私たちに登録してください</a> そして80までの製品カタログの割引を得て下さい%
プロモーションコードを有効にするときだけでなく、新しいユーザーのために - 874760
あなたは私たちの取引プラットフォームから追加の利益を受け取ることになります
誠意をこめてあなたの!
英雄聯盟世界大賽、線上電競投注
私たちはカタログの大規模な補充のためのプレミアム割引であなたを喜ばせるために急いでいます!
新規ユーザーのみ、プロモーションコードを入力すると、ストアからのオンライン注文で最大80%の割引を提供します 237630
私達は世界市場の商品の最も大きいディストリビューターです
私たちはすでにあなたのために事前に割引を手配しています、それは買い物に行くためだけに残っています <a href=https://buydiscount.pro> 今すぐ割引を購入 </a>
ここでは、任意のカテゴリと任意のニーズに製品を見つけることができるようになります、あなたの家への配信は、時間の最小量がかかります
必要なのは <a href=https://buydiscount.pro> 登録後に招待プロモーションコードを有効にします </a> 159396 そしてあなたの選ばれたプロダクトを出して下さい
私たちはあなたに幸運を願っています!
https://xn--hoya-8h5gx1jhq2b.tw/