Spec-Zone.ru › Elasticsearch 8
›Elasticsearch Guide [8.17] ›Mapping ›Mapping parameters

position_increment_gap

Анализируемые текстовые поля учитывают позиции терминов позиций, чтобы поддерживать запросы на близость или по фразе. При индексировании текстовых полей с несколькими значениями между значениями добавляется "фиктивная" дистанция, чтобы предотвратить совпадение большинства запросов по фразе между значениями. Размер этой дистанции настраивается с помощью position_increment_gap и по умолчанию равен 100.

Например:

resp = client.index(
    index="my-index-000001",
    id="1",
    document={
        "names": [
            "John Abraham",
            "Lincoln Smith"
        ]
    },
)
print(resp)

resp1 = client.search(
    index="my-index-000001",
    query={
        "match_phrase": {
            "names": {
                "query": "Abraham Lincoln"
            }
        }
    },
)
print(resp1)

resp2 = client.search(
    index="my-index-000001",
    query={
        "match_phrase": {
            "names": {
                "query": "Abraham Lincoln",
                "slop": 101
            }
        }
    },
)
print(resp2)
response = client.index(
  index: 'my-index-000001',
  id: 1,
  body: {
    names: [
      'John Abraham',
      'Lincoln Smith'
    ]
  }
)
puts response

response = client.search(
  index: 'my-index-000001',
  body: {
    query: {
      match_phrase: {
        names: {
          query: 'Abraham Lincoln'
        }
      }
    }
  }
)
puts response

response = client.search(
  index: 'my-index-000001',
  body: {
    query: {
      match_phrase: {
        names: {
          query: 'Abraham Lincoln',
          slop: 101
        }
      }
    }
  }
)
puts response
const response = await client.index({
  index: "my-index-000001",
  id: 1,
  document: {
    names: ["John Abraham", "Lincoln Smith"],
  },
});
console.log(response);

const response1 = await client.search({
  index: "my-index-000001",
  query: {
    match_phrase: {
      names: {
        query: "Abraham Lincoln",
      },
    },
  },
});
console.log(response1);

const response2 = await client.search({
  index: "my-index-000001",
  query: {
    match_phrase: {
      names: {
        query: "Abraham Lincoln",
        slop: 101,
      },
    },
  },
});
console.log(response2);
PUT my-index-000001/_doc/1
{
  "names": [ "John Abraham", "Lincoln Smith"]
}

GET my-index-000001/_search
{
  "query": {
    "match_phrase": {
      "names": {
        "query": "Abraham Lincoln" 
      }
    }
  }
}

GET my-index-000001/_search
{
  "query": {
    "match_phrase": {
      "names": {
        "query": "Abraham Lincoln",
        "slop": 101 
      }
    }
  }
}

Этот запрос по фразе не соответствует нашему документу, что вполне ожидаемо.

Этот запрос по фразе соответствует нашему документу, даже если Abraham и Lincoln находятся в разных строках, потому что slop > position_increment_gap.

Значение position_increment_gap можно указать в отображении. Например:

resp = client.indices.create(
    index="my-index-000001",
    mappings={
        "properties": {
            "names": {
                "type": "text",
                "position_increment_gap": 0
            }
        }
    },
)
print(resp)

resp1 = client.index(
    index="my-index-000001",
    id="1",
    document={
        "names": [
            "John Abraham",
            "Lincoln Smith"
        ]
    },
)
print(resp1)

resp2 = client.search(
    index="my-index-000001",
    query={
        "match_phrase": {
            "names": "Abraham Lincoln"
        }
    },
)
print(resp2)
response = client.indices.create(
  index: 'my-index-000001',
  body: {
    mappings: {
      properties: {
        names: {
          type: 'text',
          position_increment_gap: 0
        }
      }
    }
  }
)
puts response

response = client.index(
  index: 'my-index-000001',
  id: 1,
  body: {
    names: [
      'John Abraham',
      'Lincoln Smith'
    ]
  }
)
puts response

response = client.search(
  index: 'my-index-000001',
  body: {
    query: {
      match_phrase: {
        names: 'Abraham Lincoln'
      }
    }
  }
)
puts response
const response = await client.indices.create({
  index: "my-index-000001",
  mappings: {
    properties: {
      names: {
        type: "text",
        position_increment_gap: 0,
      },
    },
  },
});
console.log(response);

const response1 = await client.index({
  index: "my-index-000001",
  id: 1,
  document: {
    names: ["John Abraham", "Lincoln Smith"],
  },
});
console.log(response1);

const response2 = await client.search({
  index: "my-index-000001",
  query: {
    match_phrase: {
      names: "Abraham Lincoln",
    },
  },
});
console.log(response2);
PUT my-index-000001
{
  "mappings": {
    "properties": {
      "names": {
        "type": "text",
        "position_increment_gap": 0 
      }
    }
  }
}

PUT my-index-000001/_doc/1
{
  "names": [ "John Abraham", "Lincoln Smith"]
}

GET my-index-000001/_search
{
  "query": {
    "match_phrase": {
      "names": "Abraham Lincoln" 
    }
  }
}

Первый термин в следующем элементе массива будет находиться на расстоянии 0 терминов от последнего термина в предыдущем элементе массива.

Запрос по фразе соответствует нашему документу, что странно, но это именно то, что мы запросили в отображении.

© 2023-2025 Elasticsearch
As of September 2024, Elasticsearch is available under a choice of three licenses: the Server Side Public License (SSPL), the Elastic License, or the AGPLv3 (OSI approved).
Elasticsearch and the Elasticsearch logo are trademarks of Elasticsearch B.V., registered in the U.S. and in other countries.
https://www.elastic.co/guide/en/elasticsearch/reference/8.17/position-increment-gap.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API