https://segmentfault.com/a/1190000019753737?utm_source=tag-newest
1、構造化検索
1.1の正確な値を探します
彼らは非常に速く実行するためのフィルターが重要であり、それは計算相関(全体のスコアリング段階をスキップ)しないと簡単にキャッシュすることができます。できるだけフィルタリングクエリを使用してください。
用語クエリは、私たちが指定した正確な値を探します。自身のように、用語のクエリは簡単です。それは私たちが見てみたいフィールド名と値を受け入れます:
{
"term" : {
"price" : 20
}
}
通常、正確な値を見つけた場合、我々は、クエリのスコアが算出されたくありません。唯一の文書は、私たちがクエリを実行するために非スコアリングモデルにconstant_scoreクエリを使用し、統一されたスコアなどの用語になりますので、含めたり除外して計算されることを願っています。クエリがスコアを計算する必要がないので、constant_scoreは、より高速な方法を探していたときからです。
最終結果は、長期クエリが含まれているconstant_scoreクエリを組み合わせたものです:
GET /my_store/products/_search
{
"query" : {
"constant_score" : {
"filter" : {
"term" : {
"price" : 20 } } } } }
1.2合成フィルタ
1.2.1ブールフィルタ
{
"bool" : {
"must" : [],
"should" : [],
"must_not" : [],
}
}
must
所有的语句都 必须(must) 匹配,与 AND 等价。 must_not 所有的语句都 不能(must not) 匹配,与 NOT 等价。 should 至少有一个语句要匹配,与 OR 等价。 GET /my_store/products/_search { "query" : { "filtered" : { "filter" : { "bool" : { "should" : [ { "term" : {"price" : 20}}, { "term" : {"productID" : "XHDK-A-1293-#fJ3"}} ], "must_not" : { "term" : {"price" : 30} } } } } } }
1.2.2ネストされたブール型フィルター
SELECT document
FROM products
WHERE productID = "KDKE-B-9947-#kL5"
OR ( productID = "JODL-X-1937-#pV7"
AND price = 30 )
GET /my_store/products/_search
{
"query" : {
"filtered" : { "filter" : { "bool" : { "should" : [ { "term" : {"productID" : "KDKE-B-9947-#kL5"}}, { "bool" : { "must" : [ { "term" : {"productID" : "JODL-X-1937-#pV7"}}, { "term" : {"price" : 30}} ] }} ] } } } } }
以上1.3の正確な値を探します
如果我们想要查找价格字段值为 $20 或 $30 的文档该如何处理呢?
GET /my_store/products/_search
{
"query" : {
"constant_score" : {
"filter" : {
"terms" : {
"price" : [20, 30] } } } } }
1.4の範囲
gt: > 大于(greater than)
lt: < 小于(less than)
gte: >= 大于或等于(greater than or equal to)
lte: <= 小于或等于(less than or equal to)
GET /my_store/products/_search { "query" : { "constant_score" : { "filter" : { "range" : { "price" : { "gte" : 20, "lt" : 40 } } } } } } 如果想要范围无界(比方说 >20 ),只须省略其中一边的限制: "range" : { "price" : { "gt" : 20 } } 日期范围 "range" : { "timestamp" : { "gt" : "2014-01-01 00:00:00", "lt" : "2014-01-07 00:00:00" } } 当使用它处理日期字段时, range 查询支持对 日期计算(date math) 进行操作,比方说,如果我们想查找时间戳在过去一小时内的所有文档: "range" : { "timestamp" : { "gt" : "now-1h" } } "range" : { "timestamp" : { "gt" : "2014-01-01 00:00:00", "lt" : "2014-01-01 00:00:00||+1M" } }
1.5処理のNULL値
1.5.1が存在クエリ
SELECT tags
FROM posts
WHERE tags IS NOT NULL GET /my_index/posts/_search { "query" : { "constant_score" : { "filter" : { "exists" : { "field" : "tags" } } } } }
1.5.2。削除お問い合わせ
SELECT tags
FROM posts
WHERE tags IS NULL GET /my_index/posts/_search { "query" : { "constant_score" : { "filter": { "missing" : { "field" : "tags" } } } } }
2、フルテキスト検索
2.1マッチクエリ
試合は、中央のクエリです。クエリに一致するものが必要、フィールド、どんなには、クエリの最初の選択肢でなければなりません。それは、両方のテキストフィールドを処理するだけでなく、正確な分野に対処することを、高度なフルテキストクエリ、手段です。試合クエリのメインシナリオは、全文検索用です。
2.1.1。単一ワードクエリ
GET /my_index/my_type/_search
{
"query": {
"match": {
"title": "QUICK!"
}
}
}
2.1.2複数のワード検索
GET /my_index/my_type/_search
{
"query": {
"match": {
"title": "BROWN DOG!"
}
}
}
文書内の一致するクエリ用語ではロングテールは無関係な結果が表示されます可能性があります。これは、ショットガンスタイルの検索の一種です。私たちは、あること、条件のすべてを含む文書を検索したい茶色や犬一致していない、と茶色の犬照合することによって、すべてのドキュメントを見つけることができます。
一致クエリ演算子演算子は、入力パラメータ、オペレータであるか、またはデフォルトの場合のように受け入れることができます。私たちは、指定された条件と一致している必要がありますすべてのエントリを聞かせすることを変更することができます。
GET /my_index/my_type/_search
{
"query": {
"match": {
"title": {
"query": "BROWN DOG!", "operator": "and" } } } }
2.2複合クエリー
GET /my_index/my_type/_search
{
"query": {
"bool": {
"must": { "match": { "title": "quick" }}, "must_not": { "match": { "title": "lazy" }}, "should": [ { "match": { "title": "brown" }}, { "match": { "title": "dog" }} ] } } }
制御精度2.3
文の数と一致するために、必要に応じて、我々は我々がminimum_should_matchパラメータによって制御されなければならない試合クエリの精度を制御できるのと同じように、それは絶対的な数とすることができるが、また、割合になります
GET /my_index/my_type/_search
{
"query": {
"bool": {
"should": [
{ "match": { "title": "brown" }}, { "match": { "title": "fox" }}, { "match": { "title": "dog" }} ], "minimum_should_match": 2 } } }
結果が返された文書の次のすべての条件になります:タイトルフィールドには、「ブラウン」と「キツネ」、「ブラウン」と「犬」や「狐」と「犬」が含まれています。3つの条件すべてを含むドキュメントがある場合は、それだけで2つの関連する文書のより多くを含んでいます。
2.4クエリリフティングの重み
あなたは、「フルテキスト検索(全文検索)」のドキュメントを確認したいが、我々はより多くの重量を与えられた「Elasticsearch」または「Luceneの」文書に言及したいとし、ここではより多くの重量は、「文書が現れた場合ことを意味しelasticsearch「または」Luceneの」、彼らはこれらの言葉は全く高いと言うことです、相関スコア_score、より現れ、彼らはさらに上記の結果セットに表示されません文書化します。
GET /_search
{
"query": {
"bool": {
"must": {
"match": {
"content": { "query": "full text search", "operator": "and" } } }, "should": [ { "match": { "content": "Elasticsearch" }}, { "match": { "content": "Lucene" }} ] } } } should 语句匹配得越多表示文档的相关度越高。目前为止还挺好。 但是如果我们想让包含 Lucene 的有更高的权重,并且包含 Elasticsearch 的语句比 Lucene 的权重更高,该如何处理? 我们可以通过指定 boost 来控制任何查询语句的相对的权重, boost 的默认值为 1 ,大于 1 会提升一个语句的相对权重。所以下面重写之前的查询: GET /_search { "query": { "bool": { "must": { "match": { "content": { "query": "full text search", "operator": "and" } } }, "should": [ { "match": { "content": { "query": "Elasticsearch", "boost": 3 } }}, { "match": { "content": { "query": "Lucene", "boost": 2 } }} ] } } }
3、見通し
ESを使用するプロセスでは、オンラインESパッケージのようないくつかのサードパーティの拡張機能を検索しますが、さらに、プロジェクト内のプロジェクトの中にカプセル化のようなサードパーティの拡張機能のクラスよりやさしい使用ラッパーPHPを見つけられませんでしたし、カスタマイズする意向現在開発中の、サービスクラスをESので、文書に精通してまとめた次の更新の完了がリリースされた後、最初のステップです。現在の考え方は、一般的なクエリ操作のために、ページングを並べ替え、入ってくるパラメータクエリのフィールドをパッケージ化し、サポートするための方法です。単一のメソッドを書くように、同様の方法を検索し、検索キーワードのハイライト表示をサポートすることができます。ネイティブに複雑なクエリの直接サポート。