Поиск с точной позицией термина - PullRequest
0 голосов
/ 14 февраля 2019

Я использую анализатор пробелов для индексации моего поля с именем hash, поэтому текст моего поля '1 2 3 4 5' будет индексироваться пятью терминами [1, 2, 3, 4, 5].

Myвопрос в том, как сопоставить с точным термином зелье?например, точность больше 4/5, «2 1 3 4 5» не будет совпадать, «8 2 3 4 5» будет совпадать.Как это сделать?

Разбить на пять полей это нормально, но я хочу только одно поле.

Ответы [ 2 ]

0 голосов
/ 15 февраля 2019

Используйте анализатор пробелов, установите позицию как часть текстового значения, замените '1 2 3 4 5' на '0_1 1_2 2_3 3_4 4_5' перед индексом, 0_1 означает, что позиция равна 0, а значение равно 1. Это одно поле проиндексировано,но при поиске все равно нужен запрос с несколькими терминами.

query '8 2 3 4 5':

should: [
    { term: { hash: '0_8' } },
    { term: { hash: '1_2' } },
    { term: { hash: '2_3' } },
    { term: { hash: '3_4' } },
    { term: { hash: '4_5' } },
],
minimum_should_match: 4
0 голосов
/ 14 февраля 2019

Вы можете использовать комбинацию фильтра жетона и минимум должен совпадать во время запроса:

Объяснение:

С помощью жетонного фильтра «1 2 3 4 5» можно преобразовать в этот поток токенов:

{
  "tokens": [
    {
      "token": "1 2",
      "start_offset": 0,
      "end_offset": 3,
      "type": "shingle",
      "position": 0
    },
    {
      "token": "2 3",
      "start_offset": 2,
      "end_offset": 5,
      "type": "shingle",
      "position": 1
    },
    {
      "token": "3 4",
      "start_offset": 4,
      "end_offset": 7,
      "type": "shingle",
      "position": 2
    },
    {
      "token": "4 5",
      "start_offset": 6,
      "end_offset": 9,
      "type": "shingle",
      "position": 3
    }
  ]
}

То же самое относится и к вашему запросу.Таким образом, токен будет совпадать, только если числа находятся в правильном порядке.Использование minimu_should_match будет управлять pourcentage токена запроса, который должен совпадать в документе.

Итак, вот пример:

В отображении, которое мы настраиваемфильтр гальки и анализатор с его использованием

PUT so_54684997
{
  "mappings": {
    "_doc": {
      "properties": {
        "content": {
          "type": "text",
          "analyzer": "myShingledAnalyzer"
        }
      }
    }
  },
  "settings": {
    "analysis": {
      "filter": {
        "myShingle": {
          "type": "shingle",
          "output_unigrams": false
        }
      },
      "analyzer": {
        "myShingledAnalyzer": {
          "tokenizer": "whitespace",
          "filter": ["myShingle"]
        }
      }
    }
  }
}

Добавляем документ

PUT so_54684997/_doc/1
{
  "content": "1 2 3 4 5"
}

Запрос 1 => Не совпадают (все числано без 4/5 в том же порядке)

POST so_54684997/_search
{
  "query": {
    "match": {
      "content": {
        "query": "2 1 3 4 5",
        "minimum_should_match": "80%"
      }
    }
  }
}

Запрос 2 => Соответствие (число 4 из 5, но в хорошем порядке)

POST so_54684997/_search
{
  "query": {
    "match": {
      "content": {
        "query": "1 2 3 4",
        "minimum_should_match": "80%"
      }
    }
  }
}

Запрос 3 => Соответствие (число 4 из 5 в том же порядке)

POST so_54684997/_search
{
  "query": {
    "match": {
      "content": {
        "query": "8 2 3 4 5",
        "minimum_should_match": "80%"
      }
    }
  }
}

Я не знаю, справится ли это со всеми вашими делами, но я думаю, что это хороший советначать !

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...