ElasticSearch(5)を深く学ぶ--ElasticSearchの複雑なクエリー

6906 ワード

前回のブログではelasticsearchのmappingに関する知識を説明しましたが、elasticsearchのインデックスのmappingが特に複雑であれば、私たちが望んでいるデータをどのように検索するかについてお話しします.

1、索引を作成し、データを挿入する


まずkibanaツールを使用して複雑なインデックスを作成し、インデックスを作成します.
PUT user
{
  "mappings": {
    "student": {
      "properties": {
        "name": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": "256"
            }
          }
        },
        "age": {
          "type": "integer",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": "256"
            }
          }
        },
        "course":{
          "type":"nested",
          "properties":{
            "name":{
              "type":"text",
              "fields":{
                "keyword":{
                  "type":"keyword",
                  "ignore_above":"256"
                }
              }
            },
            "id":{
              "type":"text",
              "fields":{
                "keyword":{
                  "type":"keyword",
                  "ignore_above":"256"
                }
              }
            }
          }
        }
      }
    }
  }
}

3つのデータを挿入します.
POST user/student
{
  "name":"lihua",
  "age":"12",
  "course":{
    "name":"math",
    "id":"001"
  }
}
POST user/student
{
  "name":"zhangsan",
  "age":"15",
  "course":{
    "name":"english",
    "id":"002"
  }
}
POST user/student
{
  "name":"lisi",
  "age":"12",
  "course":[{
    "name":"math",
    "id":"001"
  },{
    "name":"chinese",
    "id":"003"
  }]
}


2、基本的なクエリーの紹介


2.1 termクエリーとtermsクエリー


term queryはインデックスを並べ替えて正確なtermを探します.分詞器の存在を知りません.term:あるフィールドにキーワードが含まれているドキュメントをクエリーします.
GET /user/student/_search
{
  "query": {
    "term": {
      "name":"lihua"
    }
  }
}

terms:あるフィールドに複数のキーワードが含まれているドキュメントを検索する
GET /user/student/_search
{
  "query": {
    "terms": {
      "name": [
        "lihua",
        "lier"
      ]
    }
  }
}

2.2 matchクエリー


match queryは分詞器の存在を知っていて、filedに対して分詞操作を行って、それからクエリーします
GET /user/student/_search
{
  "query": {
    "match": {
      "name":"lihua"
    }
  }
}

match_all:すべてのドキュメントをクエリー
GET /user/student/_search
{
  "query": {
    "match_all": {}
  }
}

multi_match:複数のフィールドを指定できます(ここでは私のフィールドが少ないので、このように例を挙げるしかありません.もちろん調べられません.読者は自分でいくつかのフィールドを追加して検索することができます)
GET /user/student/_search
{
  "query": {
    "multi_match": {
      "query": "lihua",
      "fields": ["name","course.name"]
    }
  }
}

match_phrase_prefix:接頭辞一致クエリー
GET /user/student/_search
{
  "query": {
    "match_phrase_prefix": {
      "name": "li"
    }
  }
}

match_phrase:フレーズマッチングクエリー
GET /user/student/_search
{
  "query": {
    "match_phrase": {
      "name": "lihua"
    }
  }
}

以上のクエリの間の細かい違いは、いくつかの例を探してみてください.そして、もう一つ注意しなければならないのは、ここで私のmappingの各フィールドにkeywordがあります.keywordのクエリでは分詞はできません.keyword属性elasticsearchがないと、データを分詞することになります.具体的な例は、私の前のブログを見てください.

2.3その他のクエリ


from:sizeを開始するドキュメントはどれですか:必要な数(単純なページングクエリ)
GET /user/student/_search
{
  "from": 0,
  "size": 2
}

sortを使用したソート:desc:降順、asc昇順(クエリーソート)
GET /user/student/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [ { "age": { "order":"asc" } } ]
}

簡単にクエリーをフィルタして、簡単に上のクエリーquryをpost_に変えます.filterでいいから、クエリーをフィルタするスピードが速い.
GET /user/student/_search
{
  "post_filter": {
    "match": {
      "name": "lihua"
    }
  }
}

基本的によく使われる簡単なクエリーはこれだけです.次は複雑なクエリーについて話します.もちろん、私は完全に話しているかもしれません.私のプロジェクトで出会った複雑なクエリーのニーズについて話します.

3、比較的複雑なクエリー


例1


検索名はlihua、年齢12歳のデータ
POST /user/student/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "name": "lihua"
          }
        },
        {
          "term": {
            "age": 12
          }
        }
      ]
    }
  }
}

例2


クエリーcouseには2つのカリキュラムが含まれています.1つ目のカリキュラム名はmathで、番号は001、2つ目のカリキュラム名はchineseで、番号は003です(このクエリーは複雑ですが、実際のプロジェクトでは確かに実用的で、インデックスのcourseのidとnameは強い関連性があり、ネストされたクラス型nestedを使用する必要があります.その後、クエリーでもこの点を考慮する必要があります).
GET  /user/student/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "nested": {
            "path": "course",
            "query": {
              "bool": {
                "must": [
                  {
                    "match": {
                      "course.name": "math"
                    }
                  },
                  {
                    "match": {
                      "course.id": "001"
                    }
                  }
                ]
              }
            }
          }
        },
        {
          "nested": {
            "path": "course",
            "query": {
              "bool": {
                "must": [
                  {
                    "match": {
                       "course.name": "chinese"
                    }
                  },
                  {
                    "match": {
                      "course.id": "003"
                    }
                  }
                ]
              }
            }
          }
        }
      ]
    }
  }
}

検索の中の内容は本当に多すぎると感じて、ここで言うのは氷山の一角にすぎないで、実際のプロジェクトで実際の需要を根絶して検索文を考えて編纂する必要があります.しばらく考えることができるクエリーの内容はこれだけで、後で思い出したら他のことを補充します.何か分からないことがあったり、何かアドバイスがあったら、私に連絡してください.メールボックス[email protected]