Elasticsearch Соответствие заданным

Вопрос или проблема

У меня есть номер, который следует определённому шаблону.

AR-{номер} при поиске определённого, например, AR-1033.

Я определил простой анализатор глобально, так как есть разные поля, которые требуют простого анализа.

Я пытался применить анализаторы “ключевое слово” и “пробелы” к полю номера и увеличить вес этого поля. Но получаю пустой ответ.

Если установить стандартный анализатор, он совпадает с каждым документом, потому что все они имеют это поле AR-{номер}. То же самое касается других полей в других индексах, следуя различным шаблонам (ER{номер}, C{номер} и т.д.)

(И да, я экранирую “-” в своих запросах, чтобы он отправлялся в Elasticsearch как “AR-1033”)

Я использую Elasticsearch 7.10 с FOSElasticaBundle, но когда я пробую искать в Kibana, я получаю те же результаты, что и при поиске через IndexManager, так что это не должно иметь значения.

Любая помощь будет очень признательна!

Ответ или решение

Чтобы решить вашу проблему с поиском по конкретному паттерну AR-{number} в Elasticsearch, можно использовать несколько подходов. Вам нужно учитывать, как Elasticsearch обрабатывает токены, и как настроены ваши анализаторы. Давайте рассмотрим несколько шагов и рекомендаций.

1. Настройка индекса

Убедитесь, что ваши поля, содержащие значения в формате "AR-{number}", настроены правильно. Поскольку вы упомянули, что используете simple анализатор глобально, он может не подходить для ваших нужд, так как он просто разбивает текст на токены, игнорируя символы и регистр.

Для вашего случая лучше всего подойдет следующий вариант:

PUT /your_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "custom_analyzer": {
          "type": "custom",
          "tokenizer": "whitespace",
          "filter": ["lowercase"]
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "identifier": {
        "type": "text",
        "analyzer": "custom_analyzer",
        "fields": {
          "keyword": {
            "type": "keyword"
          }
        }
      }
    }
  }
}

В данном случае поле identifier будет иметь как текстовое представление (с анализом), так и представление keyword (без анализа), что будет полезно для точного поиска.

2. Поиск с использованием правильного анализатора

При формировании запроса на поиск убедитесь, что вы обращаетесь к правильному полю. Если хотите найти точное совпадение, целесообразно использовать поле с типом keyword. Пример запроса:

GET /your_index/_search
{
  "query": {
    "term": {
      "identifier.keyword": "AR-1033"
    }
  }
}

Или, если хотите использовать текстовое поле:

GET /your_index/_search
{
  "query": {
    "match": {
      "identifier": {
        "query": "AR-1033",
        "operator": "and"
      }
    }
  }
}

3. Проверка входных данных

Убедитесь, что данные в вашем индексе действительно хранятся в ожидаемом формате. Вы можете выполнить запрос, чтобы извлечь несколько документов и проверить формат поля identifier.

GET /your_index/_search
{
  "size": 10,
  "_source": ["identifier"],
  "query": {
    "match_all": {}
  }
}

4. Настройка и тестирование в Kibana

Если поиск все еще не работает, попробуйте протестировать запросы в Kibana, как вы это делали раньше. Сравните результаты для различных вариантов запросов, чтобы определить, какой из них дает ожидаемый результат. Если у вас есть возможность, вы также можете использовать вкладку "Dev Tools" в Kibana для удобства работы с API.

Заключение

Попробуйте указанные выше настройки и принципы поиска. Если проблема не решится, возможно, стоит обратиться к логам Elasticsearch для получения более подробной информации о происходящих запросах и возможных ошибках. Оптимизация конфигурации индекса и методов поиска может занять некоторое время, но эти шаги помогут вам настроить поиск по специфичным паттернам. Надеюсь, это поможет вам решить вашу проблему!

Оцените материал
Добавить комментарий

Капча загружается...