невозможно выполнить поиск в составном запросе с помощью анализатора - PullRequest
3 голосов
/ 21 сентября 2019

У меня есть проблемный индекс, который имеет несколько полей, например теги (строка тегов через запятую), автор, тестер.Я создаю глобальный поиск, где проблемы могут быть найдены по всем этим полям одновременно.Я использую логический запрос, например

{
    "query": {
        "bool": {
            "must": [{
                    "match": {
                        "author": "author_username"
                    }
                },
                {
                    "match": {
                        "tester": "tester_username"
                    }
                },
                {
                    "match": {
                        "tags": "<tag1,tag2>"
                    }
                }

            ]
        }
    }
}

Без Analyzer Я могу получить результаты, но он использует пробел в качестве разделителя, например, Python 3 ищется как Python или 3.

Но я хотелискать Python 3 как отдельный запрос.Итак, я создал анализатор для тегов, чтобы каждый тег, разделенный запятыми, считался одним, а не стандартным пробелом.

{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "my_tokenizer"
        }
      },
      "tokenizer": {
        "my_tokenizer": {
          "type": "pattern",
          "pattern": ","
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "tags": {
        "type": "text",
        "analyzer": "my_analyzer", 
        "search_analyzer": "standard" 
      }
    }
  }
}

Но сейчас я не получаю никаких результатов.Пожалуйста, дайте мне знать, что мне здесь не хватает.Я не могу найти использование анализатора в составных запросах в документации: https://www.elastic.co/guide/en/elasticsearch/reference/current/compound-queries.html

Добавление примера:

{

   "query": {
        "bool": {
            "must": [{
                    "match": {
                        "author": "test1"
                    }
                },
                {
                    "match": {
                        "tester": "test2"
                    }
                },
                {
                    "match": {
                        "tags": "test3, abc 4"
                    }
                }

            ]
        }
    }
}

Результаты должны совпадать со всемиполя, но для поля tags должно быть объединение тегов, и запрос должен быть разделен запятой, а не пробелом.т. е. запрос должен соответствовать test и abc 4 , но выше запроса выполняется поиск test, abc и 4.

1 Ответ

2 голосов
/ 22 сентября 2019

Вам нужно либо удалить search_analyzer из своего сопоставления, либо передать my_analyzer в запросе на совпадение

GET tags/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "tags": {
              "query": "python 3",
              "analyzer": "my_analyzer"  --> by default search analyzer is used
            }
          }
        }
      ]
    }
  }
}

По умолчанию запросы будут использовать анализатор, определенный в сопоставлении полей, но это можетпереопределить настройкой search_analyzer.

...