Примеры запросов, фильтров и агрегирования Python Elasticsearch DSL

Python Elasticsearch

Адрес столбца: GitHub.com/Делайте это с душой/Особые…

В то же время, вы также можете обратить внимание на мой публичный аккаунт WeChat AlwaysBeta, вас ждет более интересный контент.

Основные понятия Elasticsearch

Индекс: логическая область, используемая Elasticsearch для хранения данных, аналогичная концепции базы данных в реляционных базах данных. Индекс может находиться на одном или нескольких осколках, а у осколка может быть несколько реплик.

Документ: данные объекта, хранящиеся в ElasticSearch, аналогичны строке данных в таблице в реляционных данных.

Документ состоит из нескольких полей, и поля с одинаковыми именами в разных документах должны иметь одинаковый тип. Поле в документе может появляться неоднократно, то есть поле будет иметь несколько значений, то есть многозначно.

Тип документа: для запросов индекс может иметь несколько документов, то есть тип документа.Это похоже на концепцию таблицы в реляционных базах данных. Однако следует отметить, что поля с одинаковыми именами в разных документах должны быть одного типа.

Отображение: оно похоже на концепцию определения схемы в реляционных базах данных. Сохраните соответствующую информацию о сопоставлении поля.Разные типы документов будут иметь разные сопоставления.

На следующем рисунке показано сравнение некоторых терминов между ElasticSearch и реляционными базами данных:

Relationnal database Elasticsearch
Database Index
Table Type
Row Document
Column Field
Schema Mapping
Schema Mapping
Index Everything is indexed
SQL Query DSL
ВЫБЕРИТЕ * ИЗ таблицы… Получить http: // ...
UPDATE table SET Ставим http://...

Введение в использование Python Elasticsearch DSL

Подключить Эс:

import elasticsearch

es = elasticsearch.Elasticsearch([{'host': '127.0.0.1', 'port': 9200}])

Загляните сначала в поиск,qОтносится к содержимому поиска, пробельные парыqРезультат запроса не влияет,sizeуказать номер,from_Укажите начальную позицию,filter_pathВы можете указать данные, которые должны отображаться, например, в этом примере отображаются только в конечном результате_idи_type.

res_3 = es.search(index="bank", q="Holmes", size=1, from_=1)
res_4 = es.search(index="bank", q=" 39225    5686 ", size=1000, filter_path=['hits.hits._id', 'hits.hits._type'])

Запросить все данные указанного индекса:

Среди них index указывает индекс, строка представляет индекс, список представляет несколько индексов, напримерindex=["bank", "banner", "country"]; Обычная форма представляет несколько индексов, удовлетворяющих условиям, напримерindex=["apple*"]ЗначитappleВсе индексы в начале.

searchможно также указать конкретныеdoc-type.

from elasticsearch_dsl import Search

s = Search(using=es, index="index-test").execute()
print s.to_dict()

В соответствии с запросом поля можно наложить несколько условий запроса:

s = Search(using=es, index="index-test").query("match", sip="192.168.1.1")
s = s.query("match", dip="192.168.1.2")
s = s.excute()

Запрос с несколькими полями:

from elasticsearch_dsl.query import MultiMatch, Match

multi_match = MultiMatch(query='hello', fields=['title', 'content'])
s = Search(using=es, index="index-test").query(multi_match)
s = s.execute()

print s.to_dict()

также можно использоватьQ()объект для запроса с несколькими полями,fieldsэто список,queryэто запрашиваемое значение.

from elasticsearch_dsl import Q

q = Q("multi_match", query="hello", fields=['title', 'content'])
s = s.query(q).execute()

print s.to_dict()

Q()Первый параметр — это метод запроса, который также может бытьbool.


q = Q('bool', must=[Q('match', title='hello'), Q('match', content='world')])
s = s.query(q).execute()

print s.to_dict()

пройти черезQ()Комбинированный запрос эквивалентен другому способу написания вышеуказанного запроса.

q = Q("match", title='python') | Q("match", title='django')
s = s.query(q).execute()
print(s.to_dict())
# {"bool": {"should": [...]}}

q = Q("match", title='python') & Q("match", title='django')
s = s.query(q).execute()
print(s.to_dict())
# {"bool": {"must": [...]}}

q = ~Q("match", title="python")
s = s.query(q).execute()
print(s.to_dict())
# {"bool": {"must_not": [...]}}

Фильтр, этот фильтр находится в диапазоне,rangeэто метод,timestampэто запросfieldназвание,gteБольше или равно,ltменьше чем и может быть установлено по мере необходимости.

оtermиmatchразница,termточное совпадение,matchОн будет подвергнут фаззингу, будет сегментирован, и будет возвращена совпадающая оценка (termЕсли вы запросите строку строчных букв, если есть прописные буквы, она вернет пустую, то есть совпадения нет.matchОн нечувствителен к регистру и может быть запрошен, а возвращаемые результаты одинаковы)

# 范围查询
s = s.filter("range", timestamp={"gte": 0, "lt": time.time()}).query("match", country="in")
# 普通过滤
res_3 = s.filter("terms", balance_num=["39225", "5686"]).execute()

Другие способы написания:

s = Search()
s = s.filter('terms', tags=['search', 'python'])
print(s.to_dict())
# {'query': {'bool': {'filter': [{'terms': {'tags': ['search', 'python']}}]}}}

s = s.query('bool', filter=[Q('terms', tags=['search', 'python'])])
print(s.to_dict())
# {'query': {'bool': {'filter': [{'terms': {'tags': ['search', 'python']}}]}}}
s = s.exclude('terms', tags=['search', 'python'])
# 或者
s = s.query('bool', filter=[~Q('terms', tags=['search', 'python'])])
print(s.to_dict())
# {'query': {'bool': {'filter': [{'bool': {'must_not': [{'terms': {'tags': ['search', 'python']}}]}}]}}}

Агрегация может быть наложена после запроса, фильтрации и других операций и должна быть добавленаaggs.

bucketТо есть группа, где первый параметр название группы, вы можете указать сами, второй параметр метод, а третий указанныйfield.

metricТо же самое справедливо,metricметод имеетsum,avg,max,minи т. д., но важно отметить, что есть два способа вернуть эти значения за один раз,statsиextended_stats, который также возвращает эквиваленты дисперсии.

# 实例1
s.aggs.bucket("per_country", "terms", field="timestamp").metric("sum_click", "stats", field="click").metric("sum_request", "stats", field="request")

# 实例2
s.aggs.bucket("per_age", "terms", field="click.keyword").metric("sum_click", "stats", field="click")

# 实例3
s.aggs.metric("sum_age", "extended_stats", field="impression")

# 实例4
s.aggs.bucket("per_age", "terms", field="country.keyword")

# 实例5,此聚合是根据区间进行聚合
a = A("range", field="account_number", ranges=[{"to": 10}, {"from": 11, "to": 21}])

res = s.execute()

Еще предстоит выполнитьexecute(), здесь следует отметить,s.aggsДействия не могут быть получены с переменными (такими какres=s.aggs, эта операция неверна), результат агрегации будет сохранен вresотображается в.

Сортировать

s = Search().sort(
    'category',
    '-title',
    {"lines" : {"order" : "asc", "mode" : "avg"}}
)

нумерация страниц

s = s[10:20]
# {"from": 10, "size": 10}

Для некоторых методов расширения заинтересованные студенты могут посмотреть:

s = Search()

# 设置扩展属性使用`.extra()`方法
s = s.extra(explain=True)

# 设置参数使用`.params()`
s = s.params(search_type="count")

# 如要要限制返回字段,可以使用`source()`方法
# only return the selected fields
s = s.source(['title', 'body'])
# don't return any fields, just the metadata
s = s.source(False)
# explicitly include/exclude fields
s = s.source(include=["title"], exclude=["user.*"])
# reset the field selection
s = s.source(None)

# 使用dict序列化一个查询
s = Search.from_dict({"query": {"match": {"title": "python"}}})

# 修改已经存在的查询
s.update_from_dict({"query": {"match": {"title": "python"}}, "size": 42})

Справочная документация:

палец насосcing.com/2017/08/12/...

накачка пальцев.com/2017/08/13/…

blog.CSDN.net/Jun Feng666/…