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"
  }
}
    

コメント

こんにちは暗号化が大好きなあなたにより快適な着

価格の可能性:TenXトークンは12月までに$150+を目指しています。
有利な収益:リーダーは、バイナリ脚から25-42%、紹介から10%を獲得します。
ユニークな戦略:TenXは、限界とロックアップを介して長期的な持続可能性と"X's"をブレンドします。
排他的な機会:利用可能な唯一の3000登録►"参加するのに最適な時間。
グローバルリーチ:TenXは、ボード上のドイツ、アルゼンチン、インドと国際的に行きます。
お見逃しなく! 今すぐ登録して、TenX Token journeyに参加してください。
あなたの投資の10倍の成長を体験してください
アクトファスト登録はこちら:
Official site here: https://tinyurl.com/tenxen
+
Telegram: https://tinyurl.com/tenx-telegram
Facebook: https://tinyurl.com/facebookTenX
Twitter: https://tinyurl.com/twitterTenX

TenX Token Loyalty Rewards
TenX Token Roadmap Updates
TenX Token Adoption
TenX Token Staking
Cryptocurrency Exchange
TenX Token Community Engagement Initiatives
TenX Features
TenX Token Use Case Scenarios
Online Earnings
TenX Rewards
向新力運動彩券行



https://1688bet.tw/
冠天下


https://xn--ghq10gmvi.com/
滿天星娛樂城



https://star168.tw/
冠天下


https://xn--ghq10gmvi.com/
こんにちは! 私たちはあなたに良いニュースを伝えるために喜んでいます!
私たちはあなたをプライベート暗号化交換に招待します www.cexasia.pro
ユニークな条件は、私たちと成功した取引のためにあなたを待っています
私たちの取引所への最初の登録のために、私たちはあなたに100USDTからのユニークなプロモーションコードGLASIA24を提供します
歓迎と幸せな入札! <a href=https://cexasia.pro/>"Best asia bitchange"</a>
こんにちは親愛なる友人!
Betting on Manta tokens is already in action!
Bet your $MANTA to get extra rewards <a href=https://mantadrop.pro>Manta Network</a>
限定版を手に入れよう♥マンタ♥NFT Airdrop
追加の無料$マンタのためのあなたのバウチャー - 65201016
<a href=https://mantadrop.pro>Claim Airdrop Now</a>
こんにちは親愛なる友人!
マンタトークンに賭けることはすでに実行されています!
余分な報酬を得るためにあなたの$マンタを賭けます <a href=https://mantadrop.pro>Manta Network</a>
限定版を手に入れよう♥マンタ♥NFT Airdrop
追加の無料$マンタのためのあなたのバウチャー - 33143568
<a href=https://mantadrop.pro>Claim Airdrop Now</a>
こんにちは! 私たちはあなたに良いニュースを伝えるために喜んでいます!
私たちはあなたをプライベート暗号化交換に招待します www.cexasia.pro
ユニークな条件は、私たちと成功した取引のためにあなたを待っています
私たちの取引所への最初の登録のために、私たちは100USDTと30%の最初の預金からユニークなプロモーションコード"pbasia24"を提供します!
歓迎と幸せな入札! ]
向新力運動彩券行



https://1688bet.tw/
1    2    3    4    5    6    7    8