パス階層トークナイザー

path_hierarchy トークナイザーは、ファイルシステムパスのような階層的な値を受け取り、パスセパレーターで分割し、ツリー内の各コンポーネントに対して用語を出力します。path_hierarcy トークナイザーは、内部で Lucene の PathHierarchyTokenizer を使用します。

例の出力

Python

  1. resp = client.indices.analyze(
  2. tokenizer="path_hierarchy",
  3. text="/one/two/three",
  4. )
  5. print(resp)

Ruby

  1. response = client.indices.analyze(
  2. body: {
  3. tokenizer: 'path_hierarchy',
  4. text: '/one/two/three'
  5. }
  6. )
  7. puts response

Js

  1. const response = await client.indices.analyze({
  2. tokenizer: "path_hierarchy",
  3. text: "/one/two/three",
  4. });
  5. console.log(response);

コンソール

  1. POST _analyze
  2. {
  3. "tokenizer": "path_hierarchy",
  4. "text": "/one/two/three"
  5. }

上記のテキストは、次の用語を生成します:

テキスト

  1. [ /one, /one/two, /one/two/three ]

設定

path_hierarchy トークナイザーは、次のパラメーターを受け入れます:

delimiter パスセパレーターとして使用する文字。デフォルトは / です。
replacement 区切り文字として使用するオプションの置換文字。
デフォルトは delimiter です。
buffer_size 単一のパスで用語バッファに読み込まれる文字数。
デフォルトは 1024 です。用語バッファは、すべての
テキストが消費されるまでこのサイズで成長します。この設定を変更しないことをお勧めします。
reverse true の場合、Lucene の
ReversePathHierarchyTokenizer を使用します。
これはドメインのような階層に適しています。デフォルトは false です。
skip スキップする初期トークンの数。デフォルトは 0 です。

例の設定

この例では、path_hierarchy トークナイザーを - 文字で分割し、/ で置き換えるように設定します。最初の2つのトークンはスキップされます:

Python

  1. resp = client.indices.create(
  2. index="my-index-000001",
  3. settings={
  4. "analysis": {
  5. "analyzer": {
  6. "my_analyzer": {
  7. "tokenizer": "my_tokenizer"
  8. }
  9. },
  10. "tokenizer": {
  11. "my_tokenizer": {
  12. "type": "path_hierarchy",
  13. "delimiter": "-",
  14. "replacement": "/",
  15. "skip": 2
  16. }
  17. }
  18. }
  19. },
  20. )
  21. print(resp)
  22. resp1 = client.indices.analyze(
  23. index="my-index-000001",
  24. analyzer="my_analyzer",
  25. text="one-two-three-four-five",
  26. )
  27. print(resp1)

Ruby

  1. response = client.indices.create(
  2. index: 'my-index-000001',
  3. body: {
  4. settings: {
  5. analysis: {
  6. analyzer: {
  7. my_analyzer: {
  8. tokenizer: 'my_tokenizer'
  9. }
  10. },
  11. tokenizer: {
  12. my_tokenizer: {
  13. type: 'path_hierarchy',
  14. delimiter: '-',
  15. replacement: '/',
  16. skip: 2
  17. }
  18. }
  19. }
  20. }
  21. }
  22. )
  23. puts response
  24. response = client.indices.analyze(
  25. index: 'my-index-000001',
  26. body: {
  27. analyzer: 'my_analyzer',
  28. text: 'one-two-three-four-five'
  29. }
  30. )
  31. puts response

Js

  1. const response = await client.indices.create({
  2. index: "my-index-000001",
  3. settings: {
  4. analysis: {
  5. analyzer: {
  6. my_analyzer: {
  7. tokenizer: "my_tokenizer",
  8. },
  9. },
  10. tokenizer: {
  11. my_tokenizer: {
  12. type: "path_hierarchy",
  13. delimiter: "-",
  14. replacement: "/",
  15. skip: 2,
  16. },
  17. },
  18. },
  19. },
  20. });
  21. console.log(response);
  22. const response1 = await client.indices.analyze({
  23. index: "my-index-000001",
  24. analyzer: "my_analyzer",
  25. text: "one-two-three-four-five",
  26. });
  27. console.log(response1);

コンソール

  1. PUT my-index-000001
  2. {
  3. "settings": {
  4. "analysis": {
  5. "analyzer": {
  6. "my_analyzer": {
  7. "tokenizer": "my_tokenizer"
  8. }
  9. },
  10. "tokenizer": {
  11. "my_tokenizer": {
  12. "type": "path_hierarchy",
  13. "delimiter": "-",
  14. "replacement": "/",
  15. "skip": 2
  16. }
  17. }
  18. }
  19. }
  20. }
  21. POST my-index-000001/_analyze
  22. {
  23. "analyzer": "my_analyzer",
  24. "text": "one-two-three-four-five"
  25. }

上記の例は、次の用語を生成します:

テキスト

  1. [ /three, /three/four, /three/four/five ]

reversetrue に設定すると、次のようになります:

テキスト

  1. [ one/two/three/, two/three/, three/ ]

詳細な例

path_hierarchy トークナイザーの一般的な使用例は、ファイルパスによる結果のフィルタリングです。ファイルパスとデータをインデックスする場合、path_hierarchy トークナイザーを使用してパスを分析することで、ファイルパス文字列の異なる部分で結果をフィルタリングできます。

この例では、インデックスに2つのカスタムアナライザーを設定し、それらのアナライザーをファイル名を格納する file_path テキストフィールドのマルチフィールドに適用します。2つのアナライザーのうちの1つは逆トークン化を使用します。その後、サンプルドキュメントがインデックスされ、2人の異なるユーザーの写真フォルダー内のいくつかのファイルパスを表します。

Python

  1. resp = client.indices.create(
  2. index="file-path-test",
  3. settings={
  4. "analysis": {
  5. "analyzer": {
  6. "custom_path_tree": {
  7. "tokenizer": "custom_hierarchy"
  8. },
  9. "custom_path_tree_reversed": {
  10. "tokenizer": "custom_hierarchy_reversed"
  11. }
  12. },
  13. "tokenizer": {
  14. "custom_hierarchy": {
  15. "type": "path_hierarchy",
  16. "delimiter": "/"
  17. },
  18. "custom_hierarchy_reversed": {
  19. "type": "path_hierarchy",
  20. "delimiter": "/",
  21. "reverse": "true"
  22. }
  23. }
  24. }
  25. },
  26. mappings={
  27. "properties": {
  28. "file_path": {
  29. "type": "text",
  30. "fields": {
  31. "tree": {
  32. "type": "text",
  33. "analyzer": "custom_path_tree"
  34. },
  35. "tree_reversed": {
  36. "type": "text",
  37. "analyzer": "custom_path_tree_reversed"
  38. }
  39. }
  40. }
  41. }
  42. },
  43. )
  44. print(resp)
  45. resp1 = client.index(
  46. index="file-path-test",
  47. id="1",
  48. document={
  49. "file_path": "/User/alice/photos/2017/05/16/my_photo1.jpg"
  50. },
  51. )
  52. print(resp1)
  53. resp2 = client.index(
  54. index="file-path-test",
  55. id="2",
  56. document={
  57. "file_path": "/User/alice/photos/2017/05/16/my_photo2.jpg"
  58. },
  59. )
  60. print(resp2)
  61. resp3 = client.index(
  62. index="file-path-test",
  63. id="3",
  64. document={
  65. "file_path": "/User/alice/photos/2017/05/16/my_photo3.jpg"
  66. },
  67. )
  68. print(resp3)
  69. resp4 = client.index(
  70. index="file-path-test",
  71. id="4",
  72. document={
  73. "file_path": "/User/alice/photos/2017/05/15/my_photo1.jpg"
  74. },
  75. )
  76. print(resp4)
  77. resp5 = client.index(
  78. index="file-path-test",
  79. id="5",
  80. document={
  81. "file_path": "/User/bob/photos/2017/05/16/my_photo1.jpg"
  82. },
  83. )
  84. print(resp5)

Ruby

  1. response = client.indices.create(
  2. index: 'file-path-test',
  3. body: {
  4. settings: {
  5. analysis: {
  6. analyzer: {
  7. custom_path_tree: {
  8. tokenizer: 'custom_hierarchy'
  9. },
  10. custom_path_tree_reversed: {
  11. tokenizer: 'custom_hierarchy_reversed'
  12. }
  13. },
  14. tokenizer: {
  15. custom_hierarchy: {
  16. type: 'path_hierarchy',
  17. delimiter: '/'
  18. },
  19. custom_hierarchy_reversed: {
  20. type: 'path_hierarchy',
  21. delimiter: '/',
  22. reverse: 'true'
  23. }
  24. }
  25. }
  26. },
  27. mappings: {
  28. properties: {
  29. file_path: {
  30. type: 'text',
  31. fields: {
  32. tree: {
  33. type: 'text',
  34. analyzer: 'custom_path_tree'
  35. },
  36. tree_reversed: {
  37. type: 'text',
  38. analyzer: 'custom_path_tree_reversed'
  39. }
  40. }
  41. }
  42. }
  43. }
  44. }
  45. )
  46. puts response
  47. response = client.index(
  48. index: 'file-path-test',
  49. id: 1,
  50. body: {
  51. file_path: '/User/alice/photos/2017/05/16/my_photo1.jpg'
  52. }
  53. )
  54. puts response
  55. response = client.index(
  56. index: 'file-path-test',
  57. id: 2,
  58. body: {
  59. file_path: '/User/alice/photos/2017/05/16/my_photo2.jpg'
  60. }
  61. )
  62. puts response
  63. response = client.index(
  64. index: 'file-path-test',
  65. id: 3,
  66. body: {
  67. file_path: '/User/alice/photos/2017/05/16/my_photo3.jpg'
  68. }
  69. )
  70. puts response
  71. response = client.index(
  72. index: 'file-path-test',
  73. id: 4,
  74. body: {
  75. file_path: '/User/alice/photos/2017/05/15/my_photo1.jpg'
  76. }
  77. )
  78. puts response
  79. response = client.index(
  80. index: 'file-path-test',
  81. id: 5,
  82. body: {
  83. file_path: '/User/bob/photos/2017/05/16/my_photo1.jpg'
  84. }
  85. )
  86. puts response

Js

  1. const response = await client.indices.create({
  2. index: "file-path-test",
  3. settings: {
  4. analysis: {
  5. analyzer: {
  6. custom_path_tree: {
  7. tokenizer: "custom_hierarchy",
  8. },
  9. custom_path_tree_reversed: {
  10. tokenizer: "custom_hierarchy_reversed",
  11. },
  12. },
  13. tokenizer: {
  14. custom_hierarchy: {
  15. type: "path_hierarchy",
  16. delimiter: "/",
  17. },
  18. custom_hierarchy_reversed: {
  19. type: "path_hierarchy",
  20. delimiter: "/",
  21. reverse: "true",
  22. },
  23. },
  24. },
  25. },
  26. mappings: {
  27. properties: {
  28. file_path: {
  29. type: "text",
  30. fields: {
  31. tree: {
  32. type: "text",
  33. analyzer: "custom_path_tree",
  34. },
  35. tree_reversed: {
  36. type: "text",
  37. analyzer: "custom_path_tree_reversed",
  38. },
  39. },
  40. },
  41. },
  42. },
  43. });
  44. console.log(response);
  45. const response1 = await client.index({
  46. index: "file-path-test",
  47. id: 1,
  48. document: {
  49. file_path: "/User/alice/photos/2017/05/16/my_photo1.jpg",
  50. },
  51. });
  52. console.log(response1);
  53. const response2 = await client.index({
  54. index: "file-path-test",
  55. id: 2,
  56. document: {
  57. file_path: "/User/alice/photos/2017/05/16/my_photo2.jpg",
  58. },
  59. });
  60. console.log(response2);
  61. const response3 = await client.index({
  62. index: "file-path-test",
  63. id: 3,
  64. document: {
  65. file_path: "/User/alice/photos/2017/05/16/my_photo3.jpg",
  66. },
  67. });
  68. console.log(response3);
  69. const response4 = await client.index({
  70. index: "file-path-test",
  71. id: 4,
  72. document: {
  73. file_path: "/User/alice/photos/2017/05/15/my_photo1.jpg",
  74. },
  75. });
  76. console.log(response4);
  77. const response5 = await client.index({
  78. index: "file-path-test",
  79. id: 5,
  80. document: {
  81. file_path: "/User/bob/photos/2017/05/16/my_photo1.jpg",
  82. },
  83. });
  84. console.log(response5);

コンソール

  1. PUT file-path-test
  2. {
  3. "settings": {
  4. "analysis": {
  5. "analyzer": {
  6. "custom_path_tree": {
  7. "tokenizer": "custom_hierarchy"
  8. },
  9. "custom_path_tree_reversed": {
  10. "tokenizer": "custom_hierarchy_reversed"
  11. }
  12. },
  13. "tokenizer": {
  14. "custom_hierarchy": {
  15. "type": "path_hierarchy",
  16. "delimiter": "/"
  17. },
  18. "custom_hierarchy_reversed": {
  19. "type": "path_hierarchy",
  20. "delimiter": "/",
  21. "reverse": "true"
  22. }
  23. }
  24. }
  25. },
  26. "mappings": {
  27. "properties": {
  28. "file_path": {
  29. "type": "text",
  30. "fields": {
  31. "tree": {
  32. "type": "text",
  33. "analyzer": "custom_path_tree"
  34. },
  35. "tree_reversed": {
  36. "type": "text",
  37. "analyzer": "custom_path_tree_reversed"
  38. }
  39. }
  40. }
  41. }
  42. }
  43. }
  44. POST file-path-test/_doc/1
  45. {
  46. "file_path": "/User/alice/photos/2017/05/16/my_photo1.jpg"
  47. }
  48. POST file-path-test/_doc/2
  49. {
  50. "file_path": "/User/alice/photos/2017/05/16/my_photo2.jpg"
  51. }
  52. POST file-path-test/_doc/3
  53. {
  54. "file_path": "/User/alice/photos/2017/05/16/my_photo3.jpg"
  55. }
  56. POST file-path-test/_doc/4
  57. {
  58. "file_path": "/User/alice/photos/2017/05/15/my_photo1.jpg"
  59. }
  60. POST file-path-test/_doc/5
  61. {
  62. "file_path": "/User/bob/photos/2017/05/16/my_photo1.jpg"
  63. }

特定のファイルパス文字列に対する検索は、テキストフィールドに対してすべての例のドキュメントと一致し、ボブのドキュメントは、bob も標準アナライザーによって作成された用語の1つであるため、関連性が高く評価されます。

Python

  1. resp = client.search(
  2. index="file-path-test",
  3. query={
  4. "match": {
  5. "file_path": "/User/bob/photos/2017/05"
  6. }
  7. },
  8. )
  9. print(resp)

Ruby

  1. response = client.search(
  2. index: 'file-path-test',
  3. body: {
  4. query: {
  5. match: {
  6. file_path: '/User/bob/photos/2017/05'
  7. }
  8. }
  9. }
  10. )
  11. puts response

Js

  1. const response = await client.search({
  2. index: "file-path-test",
  3. query: {
  4. match: {
  5. file_path: "/User/bob/photos/2017/05",
  6. },
  7. },
  8. });
  9. console.log(response);

コンソール

  1. GET file-path-test/_search
  2. {
  3. "query": {
  4. "match": {
  5. "file_path": "/User/bob/photos/2017/05"
  6. }
  7. }
  8. }

特定のディレクトリ内に存在するファイルパスでドキュメントを一致させたりフィルタリングしたりするのは簡単です。file_path.tree フィールドを使用します。

Python

  1. resp = client.search(
  2. index="file-path-test",
  3. query={
  4. "term": {
  5. "file_path.tree": "/User/alice/photos/2017/05/16"
  6. }
  7. },
  8. )
  9. print(resp)

Ruby

  1. response = client.search(
  2. index: 'file-path-test',
  3. body: {
  4. query: {
  5. term: {
  6. 'file_path.tree' => '/User/alice/photos/2017/05/16'
  7. }
  8. }
  9. }
  10. )
  11. puts response

Js

  1. const response = await client.search({
  2. index: "file-path-test",
  3. query: {
  4. term: {
  5. "file_path.tree": "/User/alice/photos/2017/05/16",
  6. },
  7. },
  8. });
  9. console.log(response);

コンソール

  1. GET file-path-test/_search
  2. {
  3. "query": {
  4. "term": {
  5. "file_path.tree": "/User/alice/photos/2017/05/16"
  6. }
  7. }
  8. }

このトークナイザーの逆パラメーターを使用すると、ファイルパスの反対側から一致させることも可能です。たとえば、個々のファイル名や深いレベルのサブディレクトリなどです。次の例は、マッピングで逆パラメーターを使用するように設定された file_path.tree_reversed フィールド内の任意のディレクトリで my_photo1.jpg という名前のすべてのファイルを検索する方法を示しています。

Python

  1. resp = client.search(
  2. index="file-path-test",
  3. query={
  4. "term": {
  5. "file_path.tree_reversed": {
  6. "value": "my_photo1.jpg"
  7. }
  8. }
  9. },
  10. )
  11. print(resp)

Ruby

  1. response = client.search(
  2. index: 'file-path-test',
  3. body: {
  4. query: {
  5. term: {
  6. 'file_path.tree_reversed' => {
  7. value: 'my_photo1.jpg'
  8. }
  9. }
  10. }
  11. }
  12. )
  13. puts response

Js

  1. const response = await client.search({
  2. index: "file-path-test",
  3. query: {
  4. term: {
  5. "file_path.tree_reversed": {
  6. value: "my_photo1.jpg",
  7. },
  8. },
  9. },
  10. });
  11. console.log(response);

コンソール

  1. GET file-path-test/_search
  2. {
  3. "query": {
  4. "term": {
  5. "file_path.tree_reversed": {
  6. "value": "my_photo1.jpg"
  7. }
  8. }
  9. }
  10. }

前方および逆の両方で生成されたトークンを表示することは、同じファイルパス値に対して作成されたトークンを示すのに役立ちます。

Python

  1. resp = client.indices.analyze(
  2. index="file-path-test",
  3. analyzer="custom_path_tree",
  4. text="/User/alice/photos/2017/05/16/my_photo1.jpg",
  5. )
  6. print(resp)
  7. resp1 = client.indices.analyze(
  8. index="file-path-test",
  9. analyzer="custom_path_tree_reversed",
  10. text="/User/alice/photos/2017/05/16/my_photo1.jpg",
  11. )
  12. print(resp1)

Ruby

  1. response = client.indices.analyze(
  2. index: 'file-path-test',
  3. body: {
  4. analyzer: 'custom_path_tree',
  5. text: '/User/alice/photos/2017/05/16/my_photo1.jpg'
  6. }
  7. )
  8. puts response
  9. response = client.indices.analyze(
  10. index: 'file-path-test',
  11. body: {
  12. analyzer: 'custom_path_tree_reversed',
  13. text: '/User/alice/photos/2017/05/16/my_photo1.jpg'
  14. }
  15. )
  16. puts response

Js

  1. const response = await client.indices.analyze({
  2. index: "file-path-test",
  3. analyzer: "custom_path_tree",
  4. text: "/User/alice/photos/2017/05/16/my_photo1.jpg",
  5. });
  6. console.log(response);
  7. const response1 = await client.indices.analyze({
  8. index: "file-path-test",
  9. analyzer: "custom_path_tree_reversed",
  10. text: "/User/alice/photos/2017/05/16/my_photo1.jpg",
  11. });
  12. console.log(response1);

コンソール

  1. POST file-path-test/_analyze
  2. {
  3. "analyzer": "custom_path_tree",
  4. "text": "/User/alice/photos/2017/05/16/my_photo1.jpg"
  5. }
  6. POST file-path-test/_analyze
  7. {
  8. "analyzer": "custom_path_tree_reversed",
  9. "text": "/User/alice/photos/2017/05/16/my_photo1.jpg"
  10. }

他のタイプの検索と組み合わせてファイルパスでフィルタリングできるのも便利です。この例では、16 を持つファイルパスを探し、アリスの写真ディレクトリ内に存在する必要があります。

Python

  1. resp = client.search(
  2. index="file-path-test",
  3. query={
  4. "bool": {
  5. "must": {
  6. "match": {
  7. "file_path": "16"
  8. }
  9. },
  10. "filter": {
  11. "term": {
  12. "file_path.tree": "/User/alice"
  13. }
  14. }
  15. }
  16. },
  17. )
  18. print(resp)

Ruby

  1. response = client.search(
  2. index: 'file-path-test',
  3. body: {
  4. query: {
  5. bool: {
  6. must: {
  7. match: {
  8. file_path: '16'
  9. }
  10. },
  11. filter: {
  12. term: {
  13. 'file_path.tree' => '/User/alice'
  14. }
  15. }
  16. }
  17. }
  18. }
  19. )
  20. puts response

Js

  1. const response = await client.search({
  2. index: "file-path-test",
  3. query: {
  4. bool: {
  5. must: {
  6. match: {
  7. file_path: "16",
  8. },
  9. },
  10. filter: {
  11. term: {
  12. "file_path.tree": "/User/alice",
  13. },
  14. },
  15. },
  16. },
  17. });
  18. console.log(response);

コンソール

  1. GET file-path-test/_search
  2. {
  3. "query": {
  4. "bool" : {
  5. "must" : {
  6. "match" : { "file_path" : "16" }
  7. },
  8. "filter": {
  9. "term" : { "file_path.tree" : "/User/alice" }
  10. }
  11. }
  12. }
  13. }