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

コメント

Googleでのレビュー、投票サイトでのレビュー、gmailアカウントを作成する人が必要ですか、youtubeビデオのビューを増やしたいですか、インターネット上で小さなタス https://aviso.bz/?r=filosof20063
緊急に重要なニュースを読むためにここに来てください https://aitt.md/en/
今すぐゲームで新しいトークンを入手してください <a href=https://notreward.pro>Hamster Kombat</a>
あなたの財布にコインではない毎日の配布
私たちのプロジェクトに参加notreward.pro とtoncoinを受け取ります

<a href=https://notreward.pro>請求Notcoin</a>
こんにちは!

私はitセキュリティに関する私の経験について皆に伝えたいと思います。
私は自分のプロジェクトとアプリのすべての問題をチェックし、偶然に一つの記事を読む方法を調べ始めました。:

フルバリアントはこちら - https://www.nytimes.com/2015/05/13/business/dealbook/owner-of-anonymous-hackers-for-hire-site-steps-forward.html?searchResultPosition=1
まあ、2-3人の専門家を雇った後、彼らは私が合理的なコストで完全な監査を行うのを助けました。

頑張って!

Find a hacker
Rent a hacker
Hire a professional hacker

Professional hacker service
Hacker for hire
Professional hacker for hire
Rent a hacker
Order a hack
Unleash your inner CEO

今すぐゲームで新しいトークンを入手してくださいハムスターコンバット
あなたの財布にコインではない毎日の配布
私たちのプロジェクトに参加notreward.pro とtoncoinを受け取ります

<a href=https://notreward.pro>Notcoin Airdrop</a>
#3僱用一名殺手 名刺客 - 您可以在我們的網站上下令謀殺您不喜歡的人。我們的殺手可以開槍、刺傷人,甚至模擬街頭搶劫。如何毒害一個人而不留痕跡?下令綁架。命令毆打一個人。
#3https://chinese-hitman-assassin.com/
第一借錢

https://168cash.com.tw/
第一借錢

https://168cash.com.tw/
第一借錢

https://168cash.com.tw/
第一借錢

https://168cash.com.tw/
3    4    5    6    7    8    9    10    11