Это 15-й день моего участия в августовском испытании обновлений. Узнайте подробности события:Испытание августовского обновления
подготовка данных
Работайте с интерфейсом, предоставляемым kibana.
POST /school/student/_bulk
{ "index": { "_id": 1 }}
{ "name" : "liubei", "age" : 20 , "sex": "boy", "birth": "1996-01-02" , "about": "i like diaocan he girl" }
{ "index": { "_id": 2 }}
{ "name" : "guanyu", "age" : 21 , "sex": "boy", "birth": "1995-01-02" , "about": "i like diaocan" }
{ "index": { "_id": 3 }}
{ "name" : "zhangfei", "age" : 18 , "sex": "boy", "birth": "1998-01-02" , "about": "i like travel" }
{ "index": { "_id": 4 }}
{ "name" : "diaocan", "age" : 20 , "sex": "girl", "birth": "1996-01-02" , "about": "i like travel and sport" }
{ "index": { "_id": 5 }}
{ "name" : "panjinlian", "age" : 25 , "sex": "girl", "birth": "1991-01-02" , "about": "i like travel and wusong" }
{ "index": { "_id": 6 }}
{ "name" : "caocao", "age" : 30 , "sex": "boy", "birth": "1988-01-02" , "about": "i like xiaoqiao" }
{ "index": { "_id": 7 }}
{ "name" : "zhaoyun", "age" : 31 , "sex": "boy", "birth": "1997-01-02" , "about": "i like travel and music" }
{ "index": { "_id": 8 }}
{ "name" : "xiaoqiao", "age" : 18 , "sex": "girl", "birth": "1998-01-02" , "about": "i like caocao" }
{ "index": { "_id": 9 }}
{ "name" : "daqiao", "age" : 20 , "sex": "girl", "birth": "1996-01-02" , "about": "i like travel and history" }
1. Используйте match_all для запроса
GET /school/student/_search?pretty
{
"query": {
"match_all": {}
}
}
Проблема: после сопоставления через match_all будут получены все данные, но часто реальное требование бизнеса состоит не в том, чтобы найти все данные, а в том, чтобы получить то, что вы хотите; а для кластера es получить все данные напрямую, это легко чтобы вызвать явление GC. Итак, нам нужно научиться эффективно извлекать данные.
2. Запрос по ключевому полю
GET /school/student/_search?pretty
{
"query": {
"match": {"about": "travel"}
}
}
Что мне делать, если я хочу узнать о ком-то, кто любит путешествовать и не может быть мальчиком?
Этот способ неправильный, так как под одним совпадением не может появиться несколько значений поля
[match] запрос не поддерживает несколько полей, вам нужно использовать составной запрос
3. Составной запрос bool
При наличии нескольких комбинаций операторов запроса для их включения можно использовать bool.
bool и агрегаты содержат:must
,must_not
илиshould
, должно означать или
Пример: опрос людей, не являющихся мужчинами, которые любят путешествовать
GET /school/student/_search?pretty
{
"query": {
"bool": {
"must": { "match": {"about": "travel"}},
"must_not": {"match": {"sex": "boy"}}
}
}
}
4. Должен в составном запросе bool
Должен означает необязательный (если должен совпадать, он будет отображаться, в противном случае он не будет отображаться)
Пример: Запрос кто любит путешествовать, если есть мужчина, то он будет отображаться, иначе не отображаться
GET /school/student/_search?pretty
{
"query": {
"bool": {
"must": { "match": {"about": "travel"}},
"should": {"match": {"sex": "boy"}}
}
}
}
5, соответствие сроков
Точное соответствие с использованием термина
такие как числа, даты, логические значения или строки not_analyzed (неанализированные текстовые типы данных)
грамматика
{ "term": { "age": 20 }}
{ "term": { "date": "2018-04-01" }}
{ "term": { "sex": “boy” }}
{ "term": { "about": "trivel" }}
6. Используйте термины для сопоставления нескольких значений
GET /school/student/_search?pretty
{
"query": {
"bool": {
"must": { "terms": {"about": ["travel","history"]}}
}
}
}
термин в основном используется для точной фильтрации
Например: «Я люблю тебя»
Соответствие под соответствием может быть парсером, содержащим: я, любовь, ты, я люблю и т. д.
По синтаксису термина это точно соответствует: «Я люблю тебя»
7. Фильтрация диапазонов
Фильтрация диапазона позволяет нам найти некоторые данные по заданному диапазону:
Рабочий диапазон | значение |
---|---|
gt | больше, чем |
gae | больше или равно |
lt | меньше, чем |
lte | меньше или равно |
Пример: найти учащихся старше 20 лет и младше 25 лет.
GET /school/student/_search?pretty
{
"query": {
"range": {
"age": {"gt":20,"lte":25}
}
}
}
8, существует и отсутствует фильтрация
существующие и отсутствующие фильтры могут определить, содержит ли документ поле или не имеет поля
Пример: поиск документов с возрастом в поле
GET /school/student/_search?pretty
{
"query": {
"exists": {
"field": "age"
}
}
}
9. Мультиусловная фильтрация bool
Использование bool также может фильтровать многострочные условия, такие как предыдущее совпадение:
ключевые слова | значение | эквивалентно |
---|---|---|
must | Точное совпадение нескольких условий запроса | and |
must_not | Обратное сопоставление нескольких условий запроса | not |
should | Соответствует хотя бы одно условие запроса | or |
Пример. Отфильтровать учащихся, в поле «О которых» указано путешествие, а также учащихся старше 20 и моложе 30 лет.
GET /school/student/_search?pretty
{
"query": {
"bool": {
"must": [
{"term": {
"about": {
"value": "travel"
}
}},{"range": {
"age": {
"gte": 20,
"lte": 30
}
}}
]
}
}
}
10. Комбинируйте условия запроса и фильтра
Обычно сложные операторы запроса, нам также необходимо взаимодействовать с операторами фильтра для достижения кэширования, что может быть достигнуто с помощью операторов фильтра.
Пример: запрос документов, которые любят путешествовать и возраст которых составляет 20 лет.
GET /school/student/_search?pretty
{
"query": {
"bool": {
"must": {"match": {"about": "travel"}},
"filter": [{"term":{"age": 20}}]
}
}
}