2016-11-30 14 views
0

私は、コンフィグレーションハッシュをURLにマッピングするためのElasticsearch v5インデックスを設定しました。パス階層トークナイザと最も近い祖先を照合

{ 
"settings": { 
    "analysis": { 
    "analyzer": { 
     "url-analyzer": { 
      "type": "custom", 
      "tokenizer": "url-tokenizer" 
     } 
    }, 
    "tokenizer": { 
     "url-tokenizer": { 
      "type": "path_hierarchy", 
      "delimiter": "/" 
     } 
    } 
} 
}, 
"mappings": { 
    "route": { 
     "properties": { 
     "uri": { 
      "type": "string", 
      "index": "analyzed", 
      "analyzer": "url-analyzer" 
     }, 
     "config": { 
      "type": "object" 
     }}}}} 

私は/trousersを検索したときの文書

{ "uri": "/trousers/", "config": { "foo": 1 }} 
{ "uri": "/trousers/grey", "config": { "foo": 2 }} 
{ "uri": "/trousers/grey/lengthy", "config": { "foo": 3 }} 

与えられ、上位結果はtrousersする必要がありますように、と私が検索したとき、私は、最も高いスコアを持つ最長パスのプレフィックスと一致したいと思います/trousers/grey/shortの場合、結果は/trousers/greyになります。

代わりに、/trousersの最上位の結果が/trousers/grey/lengthyであることがわかりました。

これを達成するために私のドキュメントをどのようにインデックス付けしてクエリできますか?

答えて

0

私はそれを飲んだ後、1​​つの解決策を持っています:インデックスのURIをキーワードとして扱いますが、引き続き検索入力にPathHierarchyTokenizerを使用しますか?私たちは/trousers/grey/shortのクエリを送信すると、search_analyzerが入力[trousers, trousers/grey, trousers/grey/short]を構築することができます

/trousers /trousers/grey /trousers/grey/lengthy

今、私たちは、次のドキュメントを格納します。

ドキュメントの最初の2つが一致し、カスタムソートを使用して最長一致を簡単に選択できます。

今私達のマッピングドキュメントは、次のようになります。

{ 
"settings": { 
"analysis": { 
    "analyzer": { 
     "uri-analyzer": { 
      "type": "custom", 
      "tokenizer": "keyword" 
     }, 
     "uri-query": { 
       "type": "custom", 
       "tokenizer": "uri-tokenizer" 
     } 
    }, 
    "tokenizer": { 
     "uri-tokenizer": { 
      "type": "path_hierarchy", 
      "delimiter": "/" 
     } 
    } 
}}, 

"mappings": { 
    "route": { 
     "properties": { 
     "uri": { 
      "type": "text", 
      "fielddata": true, 
      "analyzer": "uri-analyzer", 
      "search_analyzer": "uri-query" 
     }, 

     "config": { 
      "type": "object" 
     } 
     } 
    } 
    } 
} 

`` `

と私たちのクエリは次のようになります。

{ 
    "sort": { 
      "_script": { 
        "script": "doc.uri.length", 
        "order": "asc", 
        "type": "number" 
      } 
    }, 
    "query": { 
     "match": { 
     "uri": { 
       "query": "/trousers/grey/lengthy", 
       "type": "boolean" 
     } 
    } 
    } 
} 
関連する問題