Поиск запроса Elasti c по длине строки - PullRequest
0 голосов
/ 05 апреля 2020
{
    "query": {
      "bool": {
        "must": {
          "bool": {
            "must": [
              {
                "multi_match": {
                  "query": "FGTHSF-2124-6",
                  "type": "phrase_prefix",
                 "fields": [
                    "contact.name"
                  ]
                }
              },
              {
                "terms": {
                  "contact.id": [
                    "sdfwerwe",
                    "6789",
                    "4567",
                    "12345"
                  ]
                }
              }
            ],
            "should": [],
            "must_not": []
          }
        },
        "filter": {
          "bool": {
            "must": {
              "bool": {
                "must": [],
                "should": [],
                "must_not": []
              }
            }
          }
        }
      }
    }
  }

У меня есть этот запрос, если я ищу его, я не получаю результатов, потому что последний символ - одиночный ди git, но если я даю 3 ди git, он ищет правильную запись ... Есть ли какой-то размер по умолчанию для запроса префикса фразы и, если есть, то как его изменить.





Я попытался указать оператор по умолчанию, prefix_length, max extensions et c.

1 Ответ

0 голосов
/ 05 апреля 2020

contact.name имеет search_analyzer в качестве "стандартного" и анализатор индекса в качестве "автозаполнения" (настройки недоступны в вопросе). Ваша проблема заключается в том, что поле преобразуется в разные токены при индексации и поиске, поэтому они не совпадают.

Обычно один и тот же анализатор следует применять во время индексации и во время поиска, чтобы гарантировать, что термины в запросе в том же формате, что и термины в инвертированном индексе.

Иногда, однако, может иметь смысл использовать другой анализатор во время поиска, например, при использовании токенайзера edge_ngram для автозаполнения.

отл. с настройками ниже

"settings": {
    "analysis": {
      "filter": {
        "autocomplete_filter": {
          "type": "edge_ngram",
          "min_gram": 3,
          "max_gram": 3
        }
      },
      "analyzer": {
        "autocomplete": { 
          "type": "custom",
          "tokenizer": "standard",
          "filter": [
            "lowercase",
            "autocomplete_filter"
          ]
        }
      }
    }
  },
  "mappings": {
  .....
 }

Следующие токены будут сохранены в индексе

GET index79/_analyze
{
  "text": "FGTHSF-2124-645",
  "analyzer": "autocomplete"
}

{
  "tokens" : [
    {
      "token" : "fgt",
      "start_offset" : 0,
      "end_offset" : 6,
      "type" : "<ALPHANUM>",
      "position" : 0
    },
    {
      "token" : "212",
      "start_offset" : 7,
      "end_offset" : 11,
      "type" : "<NUM>",
      "position" : 1
    },
    {
      "token" : "645",
      "start_offset" : 12,
      "end_offset" : 15,
      "type" : "<NUM>",
      "position" : 2
    }
  ]
}

Теперь, когда вы ищете "query": "HSF-2124-6", он не вернется любой документ (["HSF", "2124", "6"]) как 6 не присутствует ни в одном токене. Чтобы вернуть документ, вам нужно изменить «min_gram» на 1, чтобы генерировать токены размером 1, 3 и 3 (645 => 6 64 645).

Если вы не используете граничный грамм, добавьте определение автозаполнения

Редактировать 1:

Если вы увидите на снимке минимальный размер грамма 5 и максимальный грамм 20. Минимальный сгенерированный токен имеет размер 5, из которых сгенерированные для них токены "Abhijeet" будут "Abhij" », "Abhije", "Abhijee", "Abhjieet". Поэтому любой текст, размер которого меньше 5, не будет совпадать с «Abhi». В вашем случае возьмите текст после разбиения на дефис ("-"), чтобы 6 не совпадало. Вам нужно обновить настройки индекса и сделать минимограммы: 1.

Шаги. 1. POST / index80 / ​​_close

Ниже приведен только пример в ваших настройках: скопируйте всю часть анализа, обновите минграм и так запрос PUT
PUT index80/_settings
{
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "my_tokenizer"
        }
      },
      "tokenizer": {
        "my_tokenizer": {
          "type": "edge_ngram",
          "min_gram": 1,
          "max_gram": 10,
          "token_chars": [
            "letter",
            "digit"
          ]
        }
      }
    }
  }

3. POST / index80 / ​​_open

Проверьте здесь о том, как обновить настройки для получения дополнительной информации.

Примечание: Уменьшение минимального размера приведет к созданию дополнительных токенов и увеличит размер вашего индекса. Выбор минимального и максимального грамма должен основываться на размере текста вашего запроса

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