position_increment_gap

Analyzed テキストフィールドは、positions を考慮に入れ、proximity or phrase queries をサポートできるようにします。複数の値を持つテキストフィールドをインデックスする際、値の間に「フェイク」ギャップが追加され、ほとんどのフレーズクエリが値をまたいで一致しないようにします。このギャップのサイズは position_increment_gap を使用して設定され、デフォルトは 100 です。

例えば:

Python

  1. resp = client.index(
  2. index="my-index-000001",
  3. id="1",
  4. document={
  5. "names": [
  6. "John Abraham",
  7. "Lincoln Smith"
  8. ]
  9. },
  10. )
  11. print(resp)
  12. resp1 = client.search(
  13. index="my-index-000001",
  14. query={
  15. "match_phrase": {
  16. "names": {
  17. "query": "Abraham Lincoln"
  18. }
  19. }
  20. },
  21. )
  22. print(resp1)
  23. resp2 = client.search(
  24. index="my-index-000001",
  25. query={
  26. "match_phrase": {
  27. "names": {
  28. "query": "Abraham Lincoln",
  29. "slop": 101
  30. }
  31. }
  32. },
  33. )
  34. print(resp2)

Ruby

  1. response = client.index(
  2. index: 'my-index-000001',
  3. id: 1,
  4. body: {
  5. names: [
  6. 'John Abraham',
  7. 'Lincoln Smith'
  8. ]
  9. }
  10. )
  11. puts response
  12. response = client.search(
  13. index: 'my-index-000001',
  14. body: {
  15. query: {
  16. match_phrase: {
  17. names: {
  18. query: 'Abraham Lincoln'
  19. }
  20. }
  21. }
  22. }
  23. )
  24. puts response
  25. response = client.search(
  26. index: 'my-index-000001',
  27. body: {
  28. query: {
  29. match_phrase: {
  30. names: {
  31. query: 'Abraham Lincoln',
  32. slop: 101
  33. }
  34. }
  35. }
  36. }
  37. )
  38. puts response

Js

  1. const response = await client.index({
  2. index: "my-index-000001",
  3. id: 1,
  4. document: {
  5. names: ["John Abraham", "Lincoln Smith"],
  6. },
  7. });
  8. console.log(response);
  9. const response1 = await client.search({
  10. index: "my-index-000001",
  11. query: {
  12. match_phrase: {
  13. names: {
  14. query: "Abraham Lincoln",
  15. },
  16. },
  17. },
  18. });
  19. console.log(response1);
  20. const response2 = await client.search({
  21. index: "my-index-000001",
  22. query: {
  23. match_phrase: {
  24. names: {
  25. query: "Abraham Lincoln",
  26. slop: 101,
  27. },
  28. },
  29. },
  30. });
  31. console.log(response2);

Console

  1. PUT my-index-000001/_doc/1
  2. {
  3. "names": [ "John Abraham", "Lincoln Smith"]
  4. }
  5. GET my-index-000001/_search
  6. {
  7. "query": {
  8. "match_phrase": {
  9. "names": {
  10. "query": "Abraham Lincoln"
  11. }
  12. }
  13. }
  14. }
  15. GET my-index-000001/_search
  16. {
  17. "query": {
  18. "match_phrase": {
  19. "names": {
  20. "query": "Abraham Lincoln",
  21. "slop": 101
  22. }
  23. }
  24. }
  25. }
このフレーズクエリは、私たちのドキュメントには一致しませんが、これは完全に予想通りです。
このフレーズクエリは私たちのドキュメントに一致しますが、AbrahamLincoln
が別々の文字列にあるにもかかわらず、slop
> position_increment_gap です。

position_increment_gap はマッピングで指定できます。例えば:

Python

  1. resp = client.indices.create(
  2. index="my-index-000001",
  3. mappings={
  4. "properties": {
  5. "names": {
  6. "type": "text",
  7. "position_increment_gap": 0
  8. }
  9. }
  10. },
  11. )
  12. print(resp)
  13. resp1 = client.index(
  14. index="my-index-000001",
  15. id="1",
  16. document={
  17. "names": [
  18. "John Abraham",
  19. "Lincoln Smith"
  20. ]
  21. },
  22. )
  23. print(resp1)
  24. resp2 = client.search(
  25. index="my-index-000001",
  26. query={
  27. "match_phrase": {
  28. "names": "Abraham Lincoln"
  29. }
  30. },
  31. )
  32. print(resp2)

Ruby

  1. response = client.indices.create(
  2. index: 'my-index-000001',
  3. body: {
  4. mappings: {
  5. properties: {
  6. names: {
  7. type: 'text',
  8. position_increment_gap: 0
  9. }
  10. }
  11. }
  12. }
  13. )
  14. puts response
  15. response = client.index(
  16. index: 'my-index-000001',
  17. id: 1,
  18. body: {
  19. names: [
  20. 'John Abraham',
  21. 'Lincoln Smith'
  22. ]
  23. }
  24. )
  25. puts response
  26. response = client.search(
  27. index: 'my-index-000001',
  28. body: {
  29. query: {
  30. match_phrase: {
  31. names: 'Abraham Lincoln'
  32. }
  33. }
  34. }
  35. )
  36. puts response

Js

  1. const response = await client.indices.create({
  2. index: "my-index-000001",
  3. mappings: {
  4. properties: {
  5. names: {
  6. type: "text",
  7. position_increment_gap: 0,
  8. },
  9. },
  10. },
  11. });
  12. console.log(response);
  13. const response1 = await client.index({
  14. index: "my-index-000001",
  15. id: 1,
  16. document: {
  17. names: ["John Abraham", "Lincoln Smith"],
  18. },
  19. });
  20. console.log(response1);
  21. const response2 = await client.search({
  22. index: "my-index-000001",
  23. query: {
  24. match_phrase: {
  25. names: "Abraham Lincoln",
  26. },
  27. },
  28. });
  29. console.log(response2);

Console

  1. PUT my-index-000001
  2. {
  3. "mappings": {
  4. "properties": {
  5. "names": {
  6. "type": "text",
  7. "position_increment_gap": 0
  8. }
  9. }
  10. }
  11. }
  12. PUT my-index-000001/_doc/1
  13. {
  14. "names": [ "John Abraham", "Lincoln Smith"]
  15. }
  16. GET my-index-000001/_search
  17. {
  18. "query": {
  19. "match_phrase": {
  20. "names": "Abraham Lincoln"
  21. }
  22. }
  23. }
次の配列要素の最初の用語は、前の配列要素の最後の用語から0用語離れています。
フレーズクエリは私たちのドキュメントに一致しますが、これは奇妙ですが、マッピングで要求したことです。