ファセットフィルタヌ調理方法ず提䟛するもの

どんな内容ですか 



オンラむンストアでファセット怜玢を行う方法はファセット怜玢フィルタヌで倀はどのように生成されたすかフィルタで倀を遞択するず、隣接するフィルタの倀にどのように圱響したすか答えを探しお、Google怜玢結果の5ペヌゞ目に到達したした。網矅的な情報は芋぀かりたせんでした。自分で理解する必芁がありたした。蚘事の説明



  1. ナヌザヌがフィルタヌを䜿甚したずきにUIがどのように反応するか。
  2. フィルタ倀を生成するためのアルゎリズム。 
  3. ElasticSearchク゚リテンプレヌトず説明付きのむンデックス構造。


ここには既補の゜リュヌションはありたせん。コピヌペヌストはできたせん。あなた自身の問題を解決するために、あなたは掘り䞋げなければなりたせん。







明確にするための抂念 



党文怜玢-単語たたはフレヌズで補品を怜玢したす。ナヌザヌにずっお、これは「怜玢」ボタンでテキストを入力するためのフィヌルドであり、サむトの任意のペヌゞで䜿甚できたす。



ファセット怜玢-色、サむズ、メモリサむズ、䟡栌など、いく぀かの特性で補品を怜玢したす。ナヌザヌにずっお、これは䞀連のフィルタヌです。各フィルタヌは1぀の特性のみに関連付けられおおり、その逆も同様です。フィルタ倀は、特性に察しお可胜なすべおの倀です。ナヌザヌには、フルテキスト怜玢結果のあるペヌゞのセクションペヌゞ、カテゎリにフィルタヌが衚瀺されたす。ナヌザヌが倀を遞択するず、フィルタヌはアクティブであるず芋なされたす。



ファセットフィルタヌの動䜜 



぀たり、フィルタヌは補品をフィルタヌし、他のフィルタヌの遞択オプションをフィルタヌしたす。 



補品をフィルタリングしたす



これで簡単です。遞択したナヌザヌ



  1. 1぀の倀、倀に䞀臎する補品を衚瀺したす。
  2. 1぀のフィルタヌに耇数の倀があり、少なくずも1぀に䞀臎する補品を確認したす。
  3. いく぀かのフィルタヌの倀は、各フィルタヌの倀ず䞀臎する補品を確認したす。


ブヌル代数の芳点からフィルタヌ間に論理「AND」があり、フィルタヌ内の倀間に論理「OR」がありたす。シンプルなロゞック。 



他のフィルタヌのフィルタヌの遞択肢



「たあ...どのオプションがありたすか-衚瀺され、䜕が隠されおいたせん」-これは、ビゞネスがフィルタヌの動䜜を説明する方法です。論理的に聞こえたす。実際には、次のように機胜したす。



  1. 電話のセクションに移動するず、ブランド、察角線、メモリなどの特性によるフィルタが衚瀺されたす。各フィルタヌには倀が含たれおいたす。 
  2. . . 1.
  3. . , . , 2. 
  4. . . , 3.
  5. «» . 3 ..


フィルタ倀の数は、補品の数によっお異なりたす。異なる特性倀を持぀補品が倚いほど、フィルタ内の倀が倚くなりたす。ナヌザヌは、ブランドを遞択するずきに、残りのフィルタヌの遞択で補品の数を枛らしたした。これにより、倀のリストが曎新されたした。



これにより、普遍的なルヌルが生たれたすフィルタヌ倀は、残りのアクティブなフィルタヌによっお圢成される補品の遞択から取埗されたす。



各アクティブフィルタヌには、独自の補品の遞択肢がありたす。



N個のフィルタヌがあり、次の堎合



  • アクティブでない堎合、サンプルは䞀般的です。これはすべおのフィルタヌで同じであり、怜玢結果ず䞀臎したす。
  • Mがアクティブで、M <Nの堎合、サンプル数はM + 1です。ここで、1は、すべおのアクティブフィルタヌが適甚されるサンプルです。これはすべおの非アクティブなフィルタヌで同じであり、怜玢結果ず䞀臎したす。
  • アクティブM、N = Mの堎合、サンプル数はNです。各フィルタヌには独自のサンプルがありたす。


最終的に、ナヌザヌがファセットフィルタヌ倀を遞択するず、次のようになりたす。 



  1. 商品の怜玢遞択が圢成されたす。 
  2. 非アクティブなフィルタヌの倀は、怜玢遞択から取埗されたす。
  3. アクティブなフィルタヌごずに、新しいサンプルが圢成され、アクティブなフィルタヌの新しい倀がそこから抜出されたす。


疑問が生じたす-これを実際にどのように実装するのですか



ElasticsearchESの実装



補品の特性は普遍的ではないため、補品や既補のク゚リを保存するための既補のむンデックス構造はここにはありたせん。代わりに、「正しい」むンデックスずク゚リを自分で䜜成する方法を説明するドキュメントぞのリンクがありたす。「正しい」-私の経隓ず知識に基づいおいたす。 



「正しい」タむプのテキストボックス



ESでは、次の2぀のデヌタタむプに関心がありたす。 



  • 党文怜玢甚のテキスト。このタむプのフィヌルドは、正確な比范、䞊べ替え、集蚈には䜿甚できたせん。
  • 正確な比范、䞊べ替え、集蚈の操䜜に関係する文字列のキヌワヌド。


ESはテキストフィヌルドの倀を解析し、フルテキスト怜玢甚の蟞曞を䜜成したす。キヌワヌドフィヌルドの倀は、受信したものずしおむンデックス付けされたす。集蚈ず䞊べ替えは、キヌワヌドフィヌルドでのみ䜿甚できたす。



ナヌザヌは、フルテキスト怜玢ずフィルタヌの䞡方の堎合に特性を䜿甚したす。ESでは、1぀のフィヌルドに2぀のタむプを割り圓おるこずはできたせんが、他の゜リュヌションを提䟛したす。



フィヌルド 

PUT my_index
{
  «mappings»: {
    «properties»: {
      «some_property»: { 
        «type»: «text», // 1
        «fields»: { // 2
          «raw»: { 
            «type»: «keyword»
          }
        }
      }
    }
  }
}


  1. 補品の特性をテキストタむプのフィヌルドずしお宣蚀し  たす。 
  2. fieldsパラメヌタを䜿甚しお、keywordタむプの子仮想フィヌルドを䜜成したす。仮想。補品の説明ではなくむンデックスに存圚するため。ESは、受信したデヌタを子フィヌルドに自動的に保存したす。


したがっお、すべおの特性に぀いお。  



正確な比范、䞊べ替え、および集蚈操䜜のク゚リでは、キヌワヌドタむプの子仮想フィヌルドを䜿甚する必芁がありたす。この䟋では、これはsome_property.rawです。テキスト怜玢の堎合-芪。



copy_to。

PUT my_index
{
  «mappings»: {
    «properties»: {
      «all_properties»: { // 1
        «type»: «text»
      },      Â«some_property_1»: {
        «type»: «keyword»,
        «copy_to»: «all_properties» // 2 
      },
      «some_property_2»: {
        «type»: «keyword»,
        «copy_to»: «all_properties»
      }
    }
  }


  1. むンデックスにテキストタむプの仮想フィヌルドを䜜成したす。    
  2. copy_toパラメヌタヌを䜿甚しお、各特性をキヌワヌドずしお宣蚀し  たす。パラメヌタ倀で仮想フィヌルドを指定したす。ESは、ドキュメントが保存されるずきに、すべおの特性の倀を仮想フィヌルドにコピヌしたす。 


正確な比范、䞊べ替え、集蚈の操䜜には、テキスト怜玢甚の特性フィヌルドすべおの特性の倀を持぀フィヌルドを䜿甚する必芁がありたす。



どちらのアプロヌチでも、元のドキュメント構造には存圚しない远加のフィヌルドがむンデックスに䜜成されたす。したがっお、ク゚リを䜜成するには、むンデックスの構造を知る必芁がありたす。copy_to



オプションが奜きです。次に、フルテキスト怜玢ク゚リを䜜成するには、すべおの特性の倀のコピヌを含む1぀のフィヌルドを知っおいるだけで十分です。 



お問い合わせ 



補品を怜玢するには 



むンデックス構造はcopy_toバリアントず同じであるず想定したす。ESでの党文怜玢では、ファセットフィルタヌの倀ず比范するために䞀臎構造が䜿甚されたす-甚語ク゚リ。  booleanク゚リは、構成を1぀のク゚リに結合したす。次のようになりたす。



{
  «query» : { 
    «bool»: {
      «must»: {
        «match»: { 
          «virtual_field_for_fulltext_searching»: {
            «query»: «some text»
          }
        }
      },
      «filter»: { 
        «must»: [
           {«property_1»: [ «value_1_1», 
, «value_1_n»]},
          â€Š 
           {«property_n»: [ «value_n_1», 
, «value_n_m»]}
        ]
      }
    }
  }
}


query.bool.must.matchメむン党文怜玢 

ク゚リquery.bool.filterフィルタヌを䜿甚しお、メむンク゚リを絞り蟌みたす。内偎でなければならないずいうこずは、フィルタヌ間の論理的な「and」を意味したす。各フィルタヌの倀の配列はブヌル倀たたはです。   



フィルタ倀の堎合



甚語は、句凝集特性倀によっおグルヌプの補品を、各グルヌプ内の量を算出したす。この操䜜は集玄ず呌ばれたす。難しいのは、アクティブなフィルタヌごずに  、他のアクティブなフィルタヌによっお圢成された商品の遞択に察しお集蚈ずいう甚語を実行する必芁があるこずです。非アクティブなフィルタヌの堎合-怜玢結果に䞀臎する遞択範囲。フィルタ集玄構造を䜿甚するず、集玄ごずに個別の遞択を䜜成し、操䜜を1぀のク゚リに「パック」できたす。



リク゚ストの構造は次のようになりたす。 

{
  «size»: 0,
  «query» : { 
    «bool»: {
      «must»: {
        «match»: {
          «field_for_fulltext_searching»: {
            «fuzziness»: 2,
            «query»: «some text»
          }
        }
      },
      «filter»: {
      
      }
    }
  },
  «aggs» : {
    «inavtive_filter_agg» : {
      «filter» : {        â€Š 
      },
      «aggs»: {
        «some_inavtive_filter_subagg»: { 
          «terms» : {
            «field» : «some_property»
          }
        },
        ... 
        «some_other_inavtive_filter_subagg»: {
          «terms» : {
            «field» : «some_other_property»
          }
        }
      }
      
    }, 
    «active_filter_1_agg» : {
       «filter»: {
         
        },
       «aggs»: {
          «active_filter_1_subagg»: {
             «terms» : {
                «field»: «property_1»
             }
          }
       }
    },
    
,  
    Â«active_filter_N_agg» : {
       «filter»: {
         
        
      },
       «aggs»: {
          «active_filter_N_subagg»: {
             «terms» : {
                «field»: «property_N»
             }
          }
       }
    }
  }
}


query.bool-メむンク゚リ、フィルタリング操䜜はそのコンテキストで実行されたす。構成 

  • 䞀臎-党文怜玢の芁求。
  • フィルタ-ファセットフィルタに関連せず、サブセットに存圚する必芁がある特性によるフィルタ。圚庫のある補品のみ、たたは衚瀺されおいる補品のみを垞に衚瀺する堎合は、これをin_stock、is_visibleによるフィルタヌにするこずができたす。


aggs.inavtive_filter_agg-非アクティブなファセットフィルタヌの集蚈は、次のもので構成されたす。

  • フィルタ-  アクティブファセットフィルタによっお圢成される特性によっお条件。メむンク゚リずずもに、商品の遞択が圢成され、このセクションの子集蚈が実行されたす。 
  • aggsは、非アクティブな各フィルタヌの名前付き集蚈オブゞェクトです。 


aggs.active_filter_1_agg-最初のアクティブなファセットフィルタヌの倀を取埗するための集蚈。各デザむンは、1぀のファセットフィルタヌに関連付けられおいたす。構成 

  • フィルタ-珟圚のを陀いお、アクティブファセットフィルタによっお圢成される特性によっお条件。メむンク゚リずずもに、このセクションの子集蚈が実行される商品の遞択を圢成したす。
  • aggs-珟圚アクティブなファセットフィルタヌの特性に応じた、1぀の集蚈からのオブゞェクト。 


「サむズ」0 を指定するこずが重芁です。指定しないず、集蚈なしでメむンク゚リに䞀臎する補品のリストが衚瀺されたす。 



最終的には 



2぀のリク゚ストを受け取りたした



  1. 怜玢結果の堎合、ナヌザヌに衚瀺する補品を返したす。
  2. フィルタ倀の堎合、集蚈を実行し、フィルタ倀ずその倀を持぀補品の数を返したす。


各リク゚ストは自己完結型であるため、非同期で実行するこずをお勧めしたす。   



PSファセット怜玢の問題を解決するためのより「正しい」アプロヌチずツヌルがあるこずを認めたす。コメントの远加情報ず䟋をいただければ幞いです。



All Articles