Несколько слов в фильтре - PullRequest
0 голосов
/ 02 апреля 2020

У меня есть документ с полем тегов, содержащим «Джон Смит». Этот запрос возвращает его:

{
    "query": {
        "bool": {
            "filter": {
                "term": {
                    "tags": "john"
                }
            }
        }
    }
}

Но это не так:

{
    "query": {
        "bool": {
            "filter": {
                "term": {
                    "tags": "john smith"
                }
            }
        }
    }
}

Почему? Как мне найти фильтр совпадений из нескольких слов?

Ответы [ 2 ]

0 голосов
/ 03 апреля 2020

Я создал образец индекса с предоставленными полями, и он дал правильный ответ. Отображение поля tags, которое я использовал для создания индекса:

"mappings": {
            "properties": {
                "tags": {
                    "type": "keyword"
                }
            }
}

Мы используем поле keyword, поскольку в запросе термина вам потребуется точное совпадение.

У меня есть создал три документа в этом индексе со следующим полем тегов:

{

            "_index": "secesindex",
            "_type": "_doc",
            "_id": "1",
            "_score": 1.0,
            "_source": {
                "tags": "John Smith"
            }
        },
        {
            "_index": "secesindex",
            "_type": "_doc",
            "_id": "2",
            "_score": 1.0,
            "_source": {
                "tags": "John Farraday"
            }
        },
        {
            "_index": "secesindex",
            "_type": "_doc",
            "_id": "3",
            "_score": 1.0,
            "_source": {
                "tags": "John"
            }
        }

Теперь, когда я выполняю запрос, как упомянуто выше:

{
    "query": {
        "bool": {
            "filter": {
                "term": {
                    "tags": "John Smith"

                }
            }
        }
    }
}

Это дает точное совпадение с документом, который имеет поле тегов значение, равное «Джону Смиту».

"hits": [
            {
                "_index": "secesindex",
                "_type": "_doc",
                "_id": "1",
                "_score": 0.0,
                "_source": {
                    "tags": "John Smith"
                }
            }
]
0 голосов
/ 02 апреля 2020

Вам нужно использовать запрос term , если я правильно понимаю ваши требования, то есть вы хотите искать несколько значений ie john или smith.

index def

{
    "mappings": {
        "properties": {
            "tags": {
                "type": "text"
            }
        }
    }
}

Примеры документов индекса

{
   "tags" : "john Lay"
}

{
   "tags" : "john opster"
}

{
   "tags" : "john smith"
}

Поисковый запрос для john или lay

{
    "query" : {
        "terms" : {
            "tags" : ["john", "lay"],
            "boost" : 1.0
        }
    }
}

И результат поиска

"hits": [
         {
            "_index": "so_auto",
            "_type": "_doc",
            "_id": "9",
            "_score": 1.0,
            "_source": {
               "model_name": "john smith"
            }
         },
         {
            "_index": "so_auto",
            "_type": "_doc",
            "_id": "10",
            "_score": 1.0,
            "_source": {
               "model_name": "john opster"
            }
         },
         {
            "_index": "so_auto",
            "_type": "_doc",
            "_id": "12",
            "_score": 1.0,
            "_source": {
               "model_name": "john Lay"
            }
         }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...