ElasticSearch (улучшение)

Elasticsearch

предисловие

ElasticsearchДля простого введения, пожалуйста, обратитесь к статье, написанной ранееПростое введение в Elasticsearch, это краткое введениеElasticsearchбазовая установка,DockerМетод установки, основные понятия и способы использованияJavaкод для реализацииElasticsearchизCRUDЭксплуатация и другие вводные знания.

Аннотация

Elastic Search分享

1.1 Сценарий применения эластичного стека

  • Поиск по веб-сайту, поиск по коду и т. д. (например, сбор журналов в производственной среде — анализ форматирования — полнотекстовый поиск — системное предупреждение)
  • Управление и анализ журналов, анализ производительности системы приложений, мониторинг индикаторов безопасности и т. д.

1.2.Техническая архитектура эластичного стека

Упругое статическое семейство продуктов

image-20190802210856808

Расширенная архитектура

ElasticТехническая архитектура может быть простой или расширенной, она очень расширяема, самая простая техническая архитектура заключается в использованииBeatsдля сбора данных,BeatsЭто абстрактное имя, и можно использовать конкретноеFileBeatСобирайте данные из файлов или используйтеTopBeatДля сбора информации мониторинга в системе можно сказать, что что-то вродеLinuxв системеTOPкоманды и, конечно же, многое другоеBeatsконкретная реализация, затем используйтеlogstashКонвертировать и импортировать данные вElasticsearchв последнем использованииKibanaВыполнение таких операций, как манипулирование данными и визуализация данных.

Конечно, в производственной среде наши данные могут находиться в разных местах, например в реляционной базе данных.Postgre,илиMQ, илиRedis, мы можем единообразно использоватьLogstashПреобразуйте данные, и в то же время вы также можете преобразовать данные в соответствии с количеством данных.ESКластерная архитектура представляет собойгорячий и холодныйархитектура с использованиемESМногоузловые данные в течение одного дня называются горячими данными, которые часто считываются и записываются и хранятся вESизгорячий узел, данные в течение семи дней называютсяданные температуры, то есть иногда используемые данные хранятся втеплый узел, хранить очень мало данных, которые будут использоваться вв холодном узле.

image-20190802212002520

1.3.Обзор основных понятий ЭС

Документ

ElasticsearchОриентированный на документ, документ является наименьшей единицей всех доступных для поиска данных. Например,PDF, содержание фильма, песни и т. д., документ будет сериализован вJSONформат, сохранить вElasticsearch, необходимо, чтобы каждый документ имел свой уникальный идентификатор, который может быть указан сам по себе илиElasticsearchпомогите сгенерировать. Ряд данных, как база данных.

Метаданные (аннотированная информация о документе)

"_index" : "user",
"_type" : "_doc",
"_id" : "l0D6UmwBn8Enzbv1XLz0",
"_score" : 1.6943597,
"_source" : {
    "user" : "mj",
    "sex" : "男",
    "age" : "18"
}
  • _index: имя индекса, которому принадлежит документ.
  • _type: Имя типа, которому принадлежит документ.
  • _id: уникальный идентификатор документа.
  • _version: Информация о версии документа.
  • _score: оценка релевантности документа.
  • _source: оригинал документаJSONсодержание.

показатель

показательЭто контейнер документов, набор документов, похожий на таблицу в реляционной базе данных.Индекс отражает концепцию логического пространства, и каждый индекс должен иметь свой собственныйMappingОпределение для определения имени поля и типа поля, содержащего документ. вShard(Sharding) отражает концепцию физического пространства, то есть данные в индексе хранятся вShardВыше, потому что есть кластер, необходимо обеспечить высотное использование.При сбое одной из машин данные шарда, сохраненные на ней, также могут быть доступны в обычном режиме.Поэтому естьОсколочная копия.

показательЕсть два важных понятия вMappingиSetting.MappingОпределяет поля документа и типы полей,SettingЧто определено, так это различные распределения данных.

Тип

  • До версии 7.0indexМожно создать несколькоType. тогда только одинindexсоответствует одномуType.

Узел

Узел — этоElaseticsearchэкземпляр, который по сути являетсяJAVAпроцесс. После запуска каждого узла по умолчаниюmaster eligibleузел. способен статьmasterКвалифицированный узел, так же можно жестоко указать, что он не имеет этой квалификации (node.master:false),

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

  • Вся информация об узле.
  • Вся информация индекса, соответствующий индексmappingинформация иsettingИнформация.
  • Информация о маршрутизации фрагментов.

осколок

  • Первичный шард: используется для решения проблемы горизонтального расширения данных.Через первичный шард данные распределяются по разным узлам в кластере.Первичный шард указывается при создании индекса, и его нельзя изменен позже, если только он не будет переопределен.Index.
  • Реплика: используется для решения проблемы высокой доступности, шард является копией основного шарда. Количество сегментов реплик можно регулировать динамически, а увеличение количества реплик может в определенной степени повысить доступность службы. Понимание основного сегмента можно увидеть на следующем рисунке, чтобы увидеть, как добиться высокой доступности,

image-20190802231314640

"settings" : {
    "index" : {
        // 设置主分片数
        "number_of_shards" : "1",
        "auto_expand_replicas" : "0-1",
        "provided_name" : "kibana_sample_data_logs",
        "creation_date" : "1564753951554",
        // 设置副本分片数
        "number_of_replicas" : "1",
        "uuid" : "VVMLRyw6TZeSfUvvLNYXEw",
        "version" : {
            "created" : "7010099"
        }
    }
}

1.4. Перевернутый индекс

положительный индекс: это документIDКоротко говоря, указатель содержания документа основан наIDНайдите документацию.

Перевернутый индекс: найти по содержимому документаДокументация.

Перевернутый индексСодержит следующую информацию:

  • Словарь слов: для записислова для всех документов, и объединение слов в перевернутые списки.
  • Инвертированный список: записывает набор документов, соответствующих словам, состоящий из инвертированных элементов индекса, которые содержат
    • Идентификатор документа
    • Количество вхождений слова, используемого для оценки релевантности
    • где появляется слово
    • Смещение, используемое для записи начальной и конечной позиции слова, используемое для выделения слова

пример того, что естьположительный индексиПеревернутый индексположительный индексследующее:

Идентификатор документа содержание документа
1101 Elasticsearch Study
1102 Elasticsearch Server
1103 master Elasticsearch

Возьмем пример вышеElasticsearchизменить слово наПеревернутый индекс,следующее:

Идентификатор документа (ID документа) Количество вхождений (TF) Должность Компенсировать
1101 1 0 <0,13>
1102 1 0 <0,13>
1103 1 1 <7,20>

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

1.5. Сегментация анализатора

Analysis: Анализ текста, который преобразует текст в слова (termилиtoken) процесс, гдеAnalyzerчерезAnalysisосуществленный,ElasticsearchДайте нам встроенные примеры многих токенизаторов.

  • Standard Analyzer: токенизатор по умолчанию, сегментированный по словам и преобразованный из верхнего регистра в нижний.
  • Simple Analyzer: Разделить по небуквенным символам (символы фильтруются) и преобразовать верхний регистр в нижний.
  • Stop Anayzer: стоп-слова (the,is) разделяется и преобразуется из верхнего регистра в нижний.
  • Whitespace Anayzer: сегментация пробелов, не преобразовывать верхний регистр в нижний.
  • IK: китайский токенизатор, требует установки плагина
  • ICU: Интернационализированный токенизатор, требует установки плагина.
  • jieba: популярный китайский токенизатор. Способ установки см. в приложении

PS:Elasticsearchустановить плагин,[root@34d02ff9d16c elasticsearch]# bin/elasticsearch-plugin install analysis-icu

Посмотреть установленные плагины:bin/elasticsearch-plugin list

1.6.Search API

существуетES, мы можем использоватьURL SearchиRequest Body SearchВыполнение связанных операций запроса.

URL-запрос

Использовать базовый запрос

GET /user/_search?q=2012&df=title&sort=year:desc&from=0&size=10
{
	􏲽profile􏲿: true
}
  • использоватьqстрока, определяющая запрос
  • использоватьdfУкажите поля для запроса
  • использоватьsortсортировать, использоватьfromиsizeУказать пагинацию
  • использоватьprofileВы можете запросить, как выполняется запрос

Общий запрос с указанием всех полей

GET /user/_search?q=2012
{
	"profile":"true"
}

Запрос для указанного поля


GET /user/_search?q=title:2012&sort=year:desc&from=0&size=10&timeout=1s
{
	"profile":"true"
}

Срок запроса

GET /user/_search?q=title:Beautiful Mind
{
	"profile":"true"
}
  • в примере вышеBeautifulиMindтолько дваTerm,Termявляется наименьшей единицей в запросе.
  • TermзапросORотношения, в приведенном выше примереtitleполе содержитBeautifulили содержитMindбудет получено.

Фразовый запрос

GET /user/_search?q=title:"Beautiful Mind"
{
	"profile":"true"
}
  • использоватькавычкивыражатьPhraseЗапрос
  • PhraseЗапрос выражает не толькоAndотношения, то естьTitleПоля должны содержать не толькоBeautiful Mind,и. Порядок должен быть таким же.

Групповой запрос

GET /user/_search?q=title:(Beautiful Mind)
{
	"profile":"true"
}
  • использоватьквадратных скобкахОбозначает сгруппированный запрос, обычно используетсяTermПри запросе он принесет групповой запрос.

логический запрос

  • использоватьAND,OR,NOTили||,&&,!
  • также можно использовать+(Выражатьmust),использовать-(Выражатьmust_not)
  • Обратите внимание, что оно должно быть написано с большой буквы
GET /user/_search?q=title:(Beautiful NOT Mind)
{
	"profile":"true"
}
GET /user/_search?q=title:(Beautiful %2BMind)
{
	"profile":"true"
}

PS:%2BЗначит это+, приведенный выше пример показывает, чтоtitleполе должно содержать обаBeautiful, в том числеMindполе

запрос диапазона

GET /user/_search?q=title:beautiful AND age:[2002 TO 2018%7D
{
	"profile":"true"
}
  • использовать[ ]Чтобы представить закрытый интервал, используйте{ }представляет собой открытый интервал, напримерage :[* TO 56]
  • Используйте арифметические операторы для представления диапазонов, например.year :>=2019 && <=1970

PS:URL SearchСуществует множество методов запроса. Например, не рекомендуется использовать запрос с подстановочными знаками, обычную вставку, нечеткое сопоставление, аналогичный запрос и запрос с подстановочными знаками.

Запрос тела запроса

Поместите условные параметры запроса вRequest Body, вызвать интерфейс запроса, т.е.Request BodyСпросите,

базовый запрос

POST /movies,404_idx/_search?ignore_unavailable=true
{
  "profile": true,
	"query": {
		"match_all": {}
	}
}
  • использоватьgnore_unavailable=trueиндекса можно избежать404_idxОшибки, которых не существует
  • profileиURL SearchКак и в случае с запросом, вы можете увидеть, как выполняется запрос.

Пейджинговый запрос

POST /movies/_search
{
  "from":10,
  "size":20,
  "query":{
    "match_all": {}
  }
}

Сортировать запрос

POST /movies/_search
{
  "sort":[{"order_date":"desc"}],
  "query":{
    "match_all": {}
  }
}

Фильтровать поля для запроса

POST /movies/_search
{
  "_source":["order_date"],
  "query":{
    "match_all": {}
  }
}
  • Если в документе слишком много полей, нам не нужно отображать все поля, мы можем использовать_sourceУкажите поля. Можно использовать подстановочные знаки.

запрос с помощью скрипта

  • будетESПосле некоторой обработки полей документа в
GET /movies/_search
{
  "script_fields": {
    "new_field": {
      "script": {
        "lang": "painless",
        "source": "doc['name'].value+'是大佬'"
      }
    }
  },
  "query": {
    "match_all": {}
  }
}

Срок запроса

POST /movies/_search
{
  "query": {
    "match": {
      "title": "last christmas"
    }
  }
}

POST movies/_search
{
  "query": {
    "match": {
      "title": {
        "query": "last christmas",
        "operator": "and"
      }
    }
  }
}
  • использоватьmatch, что обозначаетORОтношение
  • использоватьoperator, указывающий метод запроса

Math_phrase запрос

POST movies/_search
{
  "query": {
    "match_phrase": {
      "title":{
        "query": "one love",
         "slop": 4
      }
    }
  }
}
  • slopСимволы, разрешенные среди символов, указанных в запросе

1.7.Dynamic Mapping

MappingЭто может быть просто понято как база данныхSchemaопределить, определитьимя поля в индексе,Определить тип поля,Инвертированный индекс поля,Указывает, какой токенизатор использовать для поляЖдать.Dynamic MappingЭто означает, что когда мы создаем документ, если индекс не существует, индекс будет создан автоматически, и в то же время он будет автоматически создан.Mapping,ElasticSearchЭто автоматически поможет нам рассчитать тип поля, конечно, когда расчет будет неточным, нам нужно установить его вручную. Общие типы полей следующие:

  • Простой тип:Text,Date,Integer,BooleanЖдать
  • Сложные типы: объектные типы и вложенные типы.

мы можем использоватьGET /shgx/_mappingиндекс запросаMappingнастройки обратите внимание на следующее:

  • Когда мы добавляем поля в документы в индексе, мы надеемся обновить индекс.Mappingвы можете установитьDynamic:true.
  • Для полей, в которых уже есть данные, больше нельзя изменять ихMapping,так какLuceneИзменения не допускаются после создания инвертированного индекса.

Dynamic MappingМожно установить три значения, а именно:

  • true: Документы могут быть проиндексированы, и новые поля также могут быть проиндексированы.Mappingтакже будет обновляться.
  • false: Документы могут быть проиндексированы, новые поля не могут быть проиндексированы,Mappingне будет обновляться.
  • strict: Напишите новое поле и сообщите об ошибке напрямую.

Как написать карту

Первый способ – обратиться к официальномуAPI, написанный от руки, или вы можете создать временныйIndexпозволятьElasticSearchавтоматически, когда мы выводим основныеMapping, а затем измените его самостоятельно и, наконец, удалите временный файл index. Ниже приведены некоторые часто используемыеMappingУстановить свойства:

  • index: Вы можете указать, нужно ли индексировать поле. Установить какfalseНе будет создан инвертированный индекс, что сэкономит дисковые ресурсы.
  • null_value: в состоянии контролироватьNULLможет быть проиндексирован
  • cope_to: поместите значение поля в новое поле, новое поле можно использоватьsearch, но это поле не появляется в_sourceсередина.
  • anaylzer: токенизатор для указанного поля
  • search_anaylzer: указывает токенизатор, используемый индексом
  • index_options: Управляет структурой генерации инвертированного индекса, есть четыре случая
    • docs: Инвертированный индекс записывает только документыID
    • freqs: ЗадокументированоIDиTerm
    • positions: ЗадокументированоID,TermиTerm Position
    • offsets: ЗадокументированоID,Term,Term Positionиoffsets

PS:TextПоле типа по умолчанию имеет значениеPosition, другие типы по умолчаниюdocs, чем больше записей записано, тем больше места для хранения занято.

1.8.Агрегативный анализ агрегации

ElasticSearchНе только мощный поиск, но и его статистическая функция также довольно мощная.Агрегативный анализ заключается в подсчете количества категорий всех данных, например, сколько новых зданий находится в районе Ухоу. Сколько новой недвижимости в новом районе Тяньфу, мы можем получить, просто написав одно предложение с помощью совокупного анализа. добавлениеKibanaВизуальный анализ просто нагляден и эффективен. Обычно используются следующие коллекции:

  • Bucket Aggregation: некоторые коллекции, отвечающие определенным условиям, с использованием ключевых словterms
  • Metric Aggregation: Простые математические операции, статистический анализ полей, использование ключевых словmin,max,sum,avgд., используя ключевые словаaggs
  • Pipeline Aggregation: вторичная агрегация
  • Matrix Aggregation: работать с несколькими полями, предоставляя матрицу результатов

Пример анализа сегмента

GET kibana_sample_data_flights/_search
{
	"size": 0,
	"aggs":{
		"flight_dest":{
			"terms":{
				"field":"DestCountry"
			}
		}
	}
}

Пример анализа метрик

GET kibana_sample_data_flights/_search
{
	"size": 0,
	"aggs":{
		"flight_dest":{
			"terms":{
				"field":"DestCountry"
			},
			"aggs":{
				"avg_price":{
					"avg":{
						"field":"AvgTicketPrice"
					}
				},
				"max_price":{
					"max":{
						"field":"AvgTicketPrice"
					}
				},
				"min_price":{
					"min":{
						"field":"AvgTicketPrice"
					}
				}
			}
		}
	}
}

Приложение I

Связанное Чтение

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