search_analyzer

通常、同じ analyzer はインデックス時と検索時の両方で適用されるべきであり、クエリ内の用語が反転インデックス内の用語と同じ形式であることを保証します。

ただし、オートコンプリートのために edge_ngram トークナイザーを使用する場合や、検索時の同義語を使用する場合など、検索時に異なるアナライザーを使用することが理にかなうことがあります。

デフォルトでは、クエリはフィールドマッピングで定義された analyzer を使用しますが、search_analyzer 設定で上書きすることができます:

Python

  1. resp = client.indices.create(
  2. index="my-index-000001",
  3. settings={
  4. "analysis": {
  5. "filter": {
  6. "autocomplete_filter": {
  7. "type": "edge_ngram",
  8. "min_gram": 1,
  9. "max_gram": 20
  10. }
  11. },
  12. "analyzer": {
  13. "autocomplete": {
  14. "type": "custom",
  15. "tokenizer": "standard",
  16. "filter": [
  17. "lowercase",
  18. "autocomplete_filter"
  19. ]
  20. }
  21. }
  22. }
  23. },
  24. mappings={
  25. "properties": {
  26. "text": {
  27. "type": "text",
  28. "analyzer": "autocomplete",
  29. "search_analyzer": "standard"
  30. }
  31. }
  32. },
  33. )
  34. print(resp)
  35. resp1 = client.index(
  36. index="my-index-000001",
  37. id="1",
  38. document={
  39. "text": "Quick Brown Fox"
  40. },
  41. )
  42. print(resp1)
  43. resp2 = client.search(
  44. index="my-index-000001",
  45. query={
  46. "match": {
  47. "text": {
  48. "query": "Quick Br",
  49. "operator": "and"
  50. }
  51. }
  52. },
  53. )
  54. print(resp2)

Ruby

  1. response = client.indices.create(
  2. index: 'my-index-000001',
  3. body: {
  4. settings: {
  5. analysis: {
  6. filter: {
  7. autocomplete_filter: {
  8. type: 'edge_ngram',
  9. min_gram: 1,
  10. max_gram: 20
  11. }
  12. },
  13. analyzer: {
  14. autocomplete: {
  15. type: 'custom',
  16. tokenizer: 'standard',
  17. filter: [
  18. 'lowercase',
  19. 'autocomplete_filter'
  20. ]
  21. }
  22. }
  23. }
  24. },
  25. mappings: {
  26. properties: {
  27. text: {
  28. type: 'text',
  29. analyzer: 'autocomplete',
  30. search_analyzer: 'standard'
  31. }
  32. }
  33. }
  34. }
  35. )
  36. puts response
  37. response = client.index(
  38. index: 'my-index-000001',
  39. id: 1,
  40. body: {
  41. text: 'Quick Brown Fox'
  42. }
  43. )
  44. puts response
  45. response = client.search(
  46. index: 'my-index-000001',
  47. body: {
  48. query: {
  49. match: {
  50. text: {
  51. query: 'Quick Br',
  52. operator: 'and'
  53. }
  54. }
  55. }
  56. }
  57. )
  58. puts response

Js

  1. const response = await client.indices.create({
  2. index: "my-index-000001",
  3. settings: {
  4. analysis: {
  5. filter: {
  6. autocomplete_filter: {
  7. type: "edge_ngram",
  8. min_gram: 1,
  9. max_gram: 20,
  10. },
  11. },
  12. analyzer: {
  13. autocomplete: {
  14. type: "custom",
  15. tokenizer: "standard",
  16. filter: ["lowercase", "autocomplete_filter"],
  17. },
  18. },
  19. },
  20. },
  21. mappings: {
  22. properties: {
  23. text: {
  24. type: "text",
  25. analyzer: "autocomplete",
  26. search_analyzer: "standard",
  27. },
  28. },
  29. },
  30. });
  31. console.log(response);
  32. const response1 = await client.index({
  33. index: "my-index-000001",
  34. id: 1,
  35. document: {
  36. text: "Quick Brown Fox",
  37. },
  38. });
  39. console.log(response1);
  40. const response2 = await client.search({
  41. index: "my-index-000001",
  42. query: {
  43. match: {
  44. text: {
  45. query: "Quick Br",
  46. operator: "and",
  47. },
  48. },
  49. },
  50. });
  51. console.log(response2);

Console

  1. PUT my-index-000001
  2. {
  3. "settings": {
  4. "analysis": {
  5. "filter": {
  6. "autocomplete_filter": {
  7. "type": "edge_ngram",
  8. "min_gram": 1,
  9. "max_gram": 20
  10. }
  11. },
  12. "analyzer": {
  13. "autocomplete": {
  14. "type": "custom",
  15. "tokenizer": "standard",
  16. "filter": [
  17. "lowercase",
  18. "autocomplete_filter"
  19. ]
  20. }
  21. }
  22. }
  23. },
  24. "mappings": {
  25. "properties": {
  26. "text": {
  27. "type": "text",
  28. "analyzer": "autocomplete",
  29. "search_analyzer": "standard"
  30. }
  31. }
  32. }
  33. }
  34. PUT my-index-000001/_doc/1
  35. {
  36. "text": "Quick Brown Fox"
  37. }
  38. GET my-index-000001/_search
  39. {
  40. "query": {
  41. "match": {
  42. "text": {
  43. "query": "Quick Br",
  44. "operator": "and"
  45. }
  46. }
  47. }
  48. }
カスタム autocomplete アナライザーを定義するための分析設定。
text フィールドはインデックス時に autocomplete アナライザーを使用しますが、検索時には standard アナライザーを使用します。
このフィールドは次の用語としてインデックスされます: [ q, qu, qui, quic, quick, b, br, bro, brow, brown, f, fo, fox ]
クエリはこれらの用語の両方を検索します: [ quick, br ]

この例の完全な説明については、インデックス時の検索-タイプを参照してください。

search_analyzer 設定は、マッピングの更新 API を使用して既存のフィールドで更新できます。 これを行うには、既存の「analyzer」設定と「type」を更新されたフィールド定義に繰り返す必要があることに注意してください。