私はElasticSearchを初めて利用しています。実際のファイルシステムのパスではなく、記事、画像、ドキュメントを1つに分類する単純なテキストフィールドではなく、特定のドキュメントへのパスを示すツリーがあります。各パスエントリのタイプは、Group Name
、Assembly name
、さらにはUnknown
です。この型は、たとえばパス内の特定のエントリをスキップするクエリで使用できます。私のソースデータがSQL Serverに格納されているElasticSearchで階層を非正規化する方法は?
ツリーTree.Id
Tree.ParentId
に接続することにより構築が、各ノードが型を持っている必要があります。ドキュメントは、ツリー内のリーフに接続されています。
私は、しかし、私は非正規化と弾性でそれらを検索するための最適な方法を見つける必要があり、SQL Serverの構造を照会心配ないです。私はパスを平らにし、文書の「記述子」のリストを作成した場合、私は弾性文書として文書の各エントリを保存することができます。:
{
"path": "NodeNameRoot/NodeNameLevel_1/NodeNameLevel_2/NodeNameLevel_3/NodeNameLevel_4",
"descriptors": [
{
"name": "NodeNameRoot",
"type": "type1"
},
{
"name": "NodeNameLevel_1",
"type": "type1"
},
{
"name": "NodeNameLevel_2",
"type": "type2"
},
{
"name": "NodeNameLevel_3",
"type": "type2"
},
{
"name": "NodeNameLevel_4",
"type": "type3"
}
],
"document": {
...
}
}
を私はElasticSearchで、このような構造を照会することはできますか?または、パスを別の方法で非正規化する必要がありますか?
私の主な質問:
は、種類やテキスト値(たとえば、正規表現のマッチング)に基づいて、それらを照会することができます。たとえば、次のように入力します。パスにX
が含まれている場合、すべてのtype2-> type3パスを与えます(実際にはtype1はそのままにします)。
レベルに基づいて照会することは可能ですか?私は4つの記述子があるパスを好きです。
私は組み込み機能で検索行うことができますか私は、拡張機能を記述する必要がありますか?
編集 Gキンタナさんanwserに基づいて、私はこのようなインデックス。:
curl -X PUT \
http://localhost:9200/test \
-H 'cache-control: no-cache' \
-H 'content-type: application/json' \
-d '{
"mappings": {
"path": {
"properties": {
"names": {
"type": "text",
"fields": {
"raw": {
"type": "keyword"
},
"tokens": {
"type": "text",
"analyzer": "pathname_analyzer"
},
"depth": {
"type": "token_count",
"analyzer": "pathname_analyzer"
}
}
},
"types": {
"type": "text",
"fields": {
"raw": {
"type": "keyword"
},
"tokens": {
"type": "text",
"analyzer": "pathname_analyzer"
}
}
}
}
}
},
"settings": {
"analysis": {
"analyzer": {
"pathname_analyzer": {
"type": "pattern",
"pattern": "#->>",
"lowercase": true
}
}
}
}
}'
を行い、このように奥行きを問い合わせることができ:
正しい戻るcurl -X POST \
http://localhost:9200/test/path/_search \
-H 'content-type: application/json' \
-d '{
"query": {
"bool": {
"should": [
{"match": { "names.depth": 5 }}
]
}
}
}'
結果。私はもう少しそれをテストします。
提案した解決策で自分の質問を編集しました。それはうまくいくようですが、あなたが同じようにしたのだろうかと思います。 – appl3r
また、「深度nフィールドのテキストがXと一致する場合」を達成するには、「0」のようにノードテキストを指し示すレベルを持つ別のフィールドを導入する必要があります: "NodeNameRoot"および "" 3: "NodeNameLevel_3 " – appl3r