Адрес столбца: 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/...