Хотя ответ Джасприта верен, но не объединяет оба требования в одном DSL запроса, как было задано OP в его вопросе Как объединить их в одном DSL ?? .
Это улучшение решения Jaspreet, так как я также не использую подстановочный знак и даже избегаю анализатора n-грамм, который слишком дорогой (увеличивает размер индекса) и требует повторной индексации при изменении требований.
Один поиск Запрос для объединения обоих требований может быть выполнен следующим образом:
Отображение индекса
{
"settings": {
"analysis": {
"analyzer": {
"my_analyzer": {
"tokenizer": "standard",
"char_filter": [
"replace_underscore" -->note this
]
}
},
"char_filter": {
"replace_underscore": {
"type": "mapping",
"mappings": [
"_ => \\u0020"
]
}
}
}
},
"mappings": {
"properties": {
"title": {
"type": "text",
"analyzer" : "my_analyzer"
}
}
}
}
Индексирование ваших образцов документов
{
"title" : "gamexxx_little_guy"
}
And
{
"title" : "gamexxx_nightmare"
}
Один поисковый запрос
{
"query": {
"bool": {
"must": [ --> note this
{
"bool": {
"must": [
{
"prefix": {
"title": {
"value": "game"
}
}
}
]
}
},
{
"bool": {
"must": [
{
"match": {
"title": {
"query": "little guy"
}
}
}
]
}
}
]
}
}
}
Результат
{
"_index": "so-46873023",
"_type": "_doc",
"_id": "2",
"_score": 2.2814486,
"_source": {
"title": "gamexxx_little_guy"
}
}
Важные моменты:
- Первая часть запроса - это
prefix
запрос, который будет соответствовать game
в обоих документах. (Это позволит избежать дорогостоящих регулярных выражений). - Во второй части разрешен полнотекстовый поиск, для этого я использовал специальный анализатор, который заменяет
_
пробелами, поэтому вам не нужно дорого ( n-грамм в индексе) и простой запрос на совпадение получат результаты. - Выше запроса возвращает результат, соответствующий обоим критериям, вы можете изменить высокоуровневое условие bool на
should
с must
если, Вы хотите вернуть соответствие любым критериям.