Вопрос или проблема
У меня есть номер, который следует определённому шаблону.
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 для получения более подробной информации о происходящих запросах и возможных ошибках. Оптимизация конфигурации индекса и методов поиска может занять некоторое время, но эти шаги помогут вам настроить поиск по специфичным паттернам. Надеюсь, это поможет вам решить вашу проблему!