Соответствие elasticsearch vs term query
Я использую поиск по запросу для запроса "request.method": "GET":
{
"query": {
"filtered": {
"query": {
"match": {
"request.method": "GET"
}
},
"filter": {
"bool": {
"must": [
...
Как и ожидалось, запрос соответствия может получить результаты, как показано ниже:
![enter image description here]()
Но вопрос в том, когда вы используете запрос Term, результатов нет.
Обновите запрос, чтобы изменить "соответствие" на "term", и сохраните остальную часть:
{
"query": {
"filtered": {
"query": {
"term": {
"request.method": "GET"
}
},
"filter": {
"bool": {
"must": [
...
Я думаю, что запрос Term - это "не анализированная" версия запроса Match. Как показано на рисунке выше, существует по крайней мере одна запись имеет "request.method", равный "GET". Почему нет результатов для вышеупомянутого запроса Term? Спасибо.
![enter image description here]()
Ответы
Ответ 1
Предполагая, что вы используете Standard Analyzer GET
, становится GET
при сохранении в индексе. В исходном документе все еще будет оригинал "GET".
Запрос match
будет применять тот же стандартный анализатор к поисковому запросу и поэтому будет соответствовать тому, что хранится в индексе. В запросе term
не применяются анализаторы к поисковому запросу, поэтому он будет искать только этот точный термин в инвертированном индексе.
Чтобы использовать термин query в вашем примере, измените верхний регистр "GET" на нижний регистр "get" или измените ваше сопоставление, чтобы поле request.method было установлено на not_analyzed
.