Рубрики
Без рубрики

Создание GitHub Reppo Explorer с реагированием и эластиком

Appelasticsearchearch GitxPlore является одним из самых популярных полнотекстовых поисковых систем, которые позволяют быстро искать огромные объемы данных, в то время как Rection, возможно, лучшая библиотека для построения пользовательских интерфейсов. В течение последних нескольких месяцев я был соавтором библиотеки с открытым исходным кодом, реактивный поиск, который предоставляет компоненты реагирования

Elasticsearch является одним из самых популярных Полнотекстовый поиск Двигатели, которые позволяют быстро искать огромные объемы данных, в то время как Реагировать возможно Лучшая библиотека Для строительства пользовательских интерфейсов. За последние несколько месяцев я был соавтором библиотеки с открытым исходным кодом, Реактивный поиск , который обеспечивает реагирование компонентов для Elasticsearch и упрощает процесс создания поискового интерфейса пользователя (UI).

Это приложение, которое я буду строить в этой истории:

Краткая идея эластичности

Elasticsearch – это NoSQL База данных, которая может искать по большому количеству данных за короткое время. Выполняет Полнотекстовый поиск На данные, которые хранятся в виде документов (таких как объекты), изучав все слова в каждом документе.

Вот что Elasticsearch Docs сказать:

Даже если вы никогда не использовали Elasticsearch, прежде чем вы сможете следить с этой историей и построить свой собственный поиск по ELASTICSearch, используя реагирование и реакцию поиска. ?

Что такое реактивный поиск?

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

Вот пример, который генерирует интерфейс поиска UI с определенными предложениями категории:

Это, скорее всего, сделает нас 100+ линий без библиотек, а знание Elasticsearch Query DSL построить запрос.

В этом посте я буду использовать различные компоненты из библиотеки для создания окончательного пользовательского интерфейса.

Вы должны попробовать Последнее приложение прежде чем мы глубоко погружение. Вот …| CodeSandbox Link для того же.

Установка вещей

Прежде чем начать строить пользовательский интерфейс, нам понадобится DataSet, содержащий репозитории GitHub в Elasticsearch. Reacivesearch работает с любым индексом Elasticsearch, и вы можете легко Используйте его с вашим собственным набором данных Отказ

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

После ввода имени приложения процесс клонирования должен начать импортировать 26K + REPOS на вашу учетную запись.

Все REPOS структурированы в следующем формате:

{
  "name": "freeCodeCamp",
  "owner": "freeCodeCamp",
  "fullname": "freeCodeCamp~freeCodeCamp",
  "description": "The https://freeCodeCamp.org open source codebase and curriculum. Learn to code and help nonprofits.",
  "avatar": "https://avatars0.githubusercontent.com/u/9892522?v=4",
  "url": "https://github.com/freeCodeCamp/freeCodeCamp",
  "pushed": "2017-12-24T05:44:03Z",
  "created": "2014-12-24T17:49:19Z",
  "size": 31474,
  "stars": 291526,
  "forks": 13211,
  "topics": [
    "careers",
    "certification",
    "community",
    "curriculum",
    "d3",
    "education",
    "javascript",
    "learn-to-code",
    "math",
    "nodejs",
    "nonprofits",
    "programming",
    "react",
    "teachers"
  ],
  "language": "JavaScript",
  "watchers": 8462
}
  • Мы будем использовать Create-raction-app настроить проект. Вы можете установить Create-React-App, выполнив следующую команду в вашем терминале:
npm install -g create-react-app
  • После того, как он установлен, вы можете создать новый проект, запустив:
create-react-app gitxplore
  • После того, как проект настроен, вы можете изменить в каталог проекта и установить реактивный поиск зависимости:
cd gitxplore
npm install @appbaseio/reactivesearch
  • Вы также можете добавить CDN fontawesome, который мы будем использовать для некоторых значков, вставляя следующие строки в /public/index.html до Тег заканчивается:

Дайвинг в код

Я буду следовать простой структуре каталогов для приложения. Вот важные файлы:

src
├── App.css               // App styles
├── App.js                // App container
├── components
│   ├── Header.js         // Header component
│   ├── Results.js        // Results component
│   ├── SearchFilters.js  // Filters component
│   └── Topic.js          // rendered by Results
├── index.css             // styles
├── index.js              // ReactDOM render
└── theme.js              // colors and fonts
public
└── index.html

Вот ссылка на Окончательное репо Если вы хотите ссылаться на что-нибудь в любой момент.

1. Добавление стилей

Я написал адаптивные стили для приложения, которое вы можете скопировать в ваше приложение. Просто увоните свой любимый текстовый редактор и скопируйте стили на /src/index.csss от здесь и /src/App.csss от здесь соответственно.

Теперь создайте файл /src/theme.js Где мы добавим цвета и шрифты для нашего приложения:

const theme = {
	typography: {
		fontFamily: 'Raleway, Helvetica, sans-serif',
	},
	colors: {
		primaryColor: '#008000',
		titleColor: 'white'
	},
	secondaryColor: 'mediumseagreen',
};

export default theme;

2. Добавление первого реактивного поиска компонента

Все компоненты реактивных исследований обернуты вокруг компонента контейнера Реактивация который предоставляет данные о elasticsearch для детей реактивных компонентов.

Мы будем использовать это в /src/app.js. :

import React, { Component } from 'react';
import { ReactiveBase } from '@appbaseio/reactivesearch';
import theme from './theme';
import './App.css';
class App extends Component {
  render() {
    return (
      
); } } export default App;

Для приложение и учетные данные Опора, вы можете использовать те, которые я уже предоставил здесь. Если вы клонировали набор данных в своем собственном приложении ранее, вы можете получить их из Страница учетных данных приложения . Если вы уже знакомы с Elasticsearch, вы можете вместо этого пройти URL Опора в виду Ваш собственный elasticsearch кластер URL Отказ

Кроме того, вы также можете скопировать свое приложение учетные данные от Приложение Приборная панель Отказ Наведите курсор на карту вашего приложения и нажмите Скопировать чтение учетных данных Отказ

После добавления этого вы увидите базовый макет, как это:

3. Добавление DataSearch

Далее я добавлю DataSearch Компонент для поиска по репозиториям. Он создает компонент поиска UI и позволяет легко поискать через одну или несколько полей. Обновлено оказывать функция внутри /src/app.js будет выглядеть так:

// importing DataSearch here
import { ReactiveBase, DataSearch } from '@appbaseio/reactivesearch';
...

// Adding the DataSearch here
    
...

DataSearch Компонент идет внутри Реактивация Компонент и получает все необходимые данные от него, поэтому нам не нужно писать elasticsearch queres. Окружение Div s Добавьте немного Классическое имя Свойства для стилизации. Они просто добавляют макет в приложение. Вы можете пройти все стили на /src/App.csss который мы создали ранее. Возможно, вы заметили, что мы прошли некоторые реквизиты DataSearch составная часть.

Вот как они работают:

  • ComponentIDID : Уникальный идентификатор строки, который мы будем использовать позже, чтобы соединить два разных компонента реакций.
  • FilterLabel : строковое значение, которое появится в меню фильтров позже.
  • datafield : Массив строк, содержащих поля ELASTICSARCESC, на которых должен выполняться поиск. Вы можете проверить набор данных И увидите, что эти поля также соответствуют названию столбца. Все поля указаны здесь соответствует структуре данных, например имя относится к названию репо, Описание Относится к своему описанию, но есть поле с .сырой Добавлено здесь, name.raw который является Multi-Field из Имя поле. Elasticsearch может индексировать те же данные по разным образом для разных целей, которые мы можем использовать, чтобы получить лучшие результаты поиска.
  • Зажигатель : Устанавливает значение заполнителя в поле ввода.
  • AutoSuggest : установка ложь Значение для оперения вызывает немедленное обновление результатов в результатах.
  • Окоркировка : Устанавливает позицию? значок.
  • UrlParams : это логический Что говорит компоненту сохранить термин поиска в URL-адресе браузера, поэтому мы можем поделиться URL для определенного поискового запроса. Например, проверьте эта ссылка Чтобы увидеть все результаты, связанные с «реагированием».
  • Классическое имя : Добавляет класс Для стилизации используя CSS.
  • Innerclass : Добавляет класс Разные разделы компонента для стилизации с использованием CSS. Здесь я добавил класс к вход коробка для стилизации. Подробное описание можно найти в Документы Отказ

С этим наше приложение должно получить рабочую строку поиска:

4. Добавление представления результатов

Далее мы добавим Результаты Компонент в /src/components/results.js и импортировать его в /src/app.js. .

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

import React from 'react';
import { SelectedFilters, ReactiveList } from '@appbaseio/reactivesearch';
const onResultStats = (results, time) => (
  
{results} results found in {time}ms
); const onData = (data) => (
{data.owner}/{data.name}
); const Results = () => (
); export default Results;

Я импортировал два новых компонента из реактивных исследований, ВыбранныеFilters и Реактивист Отказ ВыбранныеFilters сделает фильтры для наших компонентов реактивных исследований в одном месте:

Реактивист оказывает результаты поиска. Вот как работает его реквизит:

  • datafield : приказывает результаты, используя Имя поле здесь.
  • Ондата : принимает функцию, которая возвращает JSX Отказ Функция передается каждый результат индивидуально. Здесь мы создаем базовый пользовательский интерфейс, который мы модифицируем позже.
  • onresultstats : похоже на Ондата Но для статистики результата. Функция передается количество Результаты найдено и время взятый.
  • реагировать : реагировать Опора говорит Реактивист Слушать изменения, сделанные Категорический поиск Компонент, мы предоставили ComponentIDID из Категорический поиск Компонент здесь называется репо Отказ Позже мы добавим больше компонентов здесь.
  • Пагинация : а логический который сообщает реактивелю разделить результаты на страницы, каждая страница, содержащая количество результатов, указанных в Размер пропры

Теперь мы можем Импорт и использовать Результаты компонент внутри /src/app.js. . Просто добавьте его внутри девочка с Результаты-контейнер класс.

...
import Results from './components/Results';
...
render() {
  return(
    ...
    
... ) }

С помощью этого компонента базовая версия нашего поиска UI должна начинаться вместе:

5. Добавление компонента заголовка

Давайте создадим Заголовок Компонент в /src/components/header.js Что мы будем использовать для рендеринга больше поисковых фильтров.

Вот как создать простой Заголовок составная часть:

import React, { Component } from 'react';

import SearchFilters from './SearchFilters';

class Header extends Component {
	constructor(props) {
		super(props);
		this.state = {
			visible: false,
		};
	}

	toggleVisibility = () => {
		const visible = !this.state.visible;
		this.setState({
			visible,
		});
	}

	render() {
		return (
			
		);
	}
}

export default Header;

Я переместил навигационный код в

от /src/app.js здесь. Компонент заголовка имеет способ, который переключается видимым в состоянии. Мы используем это, чтобы добавить класс, который заставит его занимать весь размер экрана на мобильном макете. Я также добавил кнопку переключения, которая называет Тупичка ...| метод.

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

Создайте новый файл /src/components/searchfilters.js :

import React from 'react';
const SearchFilters = () => (
    
Search filters go here!
); export default SearchFilters;

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

6. Обновление компонентов приложений и темы обработки в штате

Мы добавим Государство Переменная в Приложение Компонент называется steantopics Что будет настроек выбранных в настоящее время темы в приложении.

Затем мы будем использовать steantopics и передать их в Заголовок и Результаты компоненты:

import React, { Component } from 'react';
import { ReactiveBase, DataSearch } from '@appbaseio/reactivesearch';

import Header from './components/Header';
import Results from './components/Results';

import theme from './theme';
import './App.css';

class App extends Component {
	constructor(props) {
		super(props);
		this.state = {
			currentTopics: [],
		};
	}

	setTopics = (currentTopics) => {
		this.setState({
			currentTopics: currentTopics || [],
		});
	}

	toggleTopic = (topic) => {
		const { currentTopics } = this.state;
		const nextState = currentTopics.includes(topic)
			? currentTopics.filter(item => item !== topic)
			: currentTopics.concat(topic);
		this.setState({
			currentTopics: nextState,
		});
	}

	render() {
		return (
			
); } } export default App;

Соборки Метод будет установлен в зависимости от того, какие темы не передаются на него, которые мы перейдем к Заголовок составная часть. toggletopic Метод удалит тему из Государство в steanttopics. Если он уже присутствует и добавьте тему, если она нет.

Мы передадим toggletopic Метод Результаты составная часть:

7. Добавление больше фильтров

Давайте добавьте больше фильтров на пользовательский интерфейс в /src/components/searchfilters.js Отказ Я буду использовать три новых компонента из реактивных исследований здесь, Multidropdownlist , SingledropDownrange и Rangeslider Отказ Компоненты используются аналогичным образом, когда мы использовали DataSearch компонент раньше.

Вот код:

import React from 'react';
import PropTypes from 'prop-types';
import {
	MultiDropdownList,
	SingleDropdownRange,
	RangeSlider,
} from '@appbaseio/reactivesearch';

const SearchFilters = ({ currentTopics, setTopics, visible }) => (
	
); SearchFilters.propTypes = { currentTopics: PropTypes.arrayOf(PropTypes.string), setTopics: PropTypes.func, visible: PropTypes.bool, }; export default SearchFilters;

SearchFilters Компонент, который мы создали выше, принимают три реквизита от Заголовок Компонент, steantopics , Соборки и Видимый Отказ Видимый Проп только используется для добавления Классическое имя для стайлинга.

Первый компонент, который мы использовали здесь, это Multidropdownlist который делает раскрывающийся компонент для выбора нескольких вариантов. Первый Multidropdownlist имеет datafield language.raw Отказ Это заполнит себя всем языками, доступными в наборе данных репозитории.

Мы использовали еще один Multidropdownlist Чтобы сделать список тем:

Вот как реквизит работает здесь:

  • ComponentIDID : Похоже на предыдущие компоненты реактивных поисков, это уникальный идентификатор, который позже мы связываемся в Результаты Компонент, который мы создали, чтобы получить результаты поиска.
  • datafield : отображает компонент к topics.raw поле в elasticsearch.
  • Зажигатель : Устанавливает значение заполнителя, когда ничего не выбрана.
  • Название : Добавляет заголовок для компонента в пользовательском интерфейсе.
  • FilterLabel : Устанавливает метку компонентов в съемных фильтрах (COMPOREFILTERS IFOREFILLEFILTERS которые мы использовали в Reviews компонент). Размер
  • : говорит компонент оказать максимум 1000 предметы в списке. QueryFormat
  • : При установке ‘и’ Как мы использовали здесь, он дает результаты, которые соответствуют всем выбранным тегам (точно так же, как пересечение ). DefaultSelected
  • : Устанавливает выбранные элементы в компоненте. Здесь мы проезжаем steantopics что мы хранили в Государство на /src/app.js Отказ onvalueChange
  • : это функция, которая будет называться компонентом, когда мы внесем изменение его стоимости. Здесь мы называем Соборки Функция, которую мы получили в реквизитах. Следовательно, всякий раз, когда мы выбираем или отмените выделите значение в компоненте, он будет обновить steantopics в Государство главного Приложение составная часть.

Следующий компонент по реактивам, который мы использовали здесь, это SingledropDownrange Отказ Используется новый опорой под названием данные Отказ

Вот как это работает:

данные опоры принимает массив объектов с Начать и конец Значения и показывает указанный этикетка в раскрывающемся списке. Это сопоставлено на толкнул поле в наборе данных, который является Тип даты в elasticsearch Отказ Один круточный способ указать диапазон дат в elasticsearch использует сейчас ключевое слово. сейчас относится к текущему времени, сейчас-1м Относится к за месяц до того, как сейчас-6м до шести месяцев до и сейчас-1Y. до года до сейчас Отказ

Я использовал другой SingledropDownrange Компонент для Создано поле в наборе данных.

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

Третий компонент, который я использовал это Rangeslider который делает ползунка UI. Я использовал Rangeslider Компоненты, один для звезды поле, а другой для Формы Отказ

Два основных реквизита, которые этот компонент представляет собой диапазон и Rangelabels :

  • Диапазон : опоры определяет диапазон данных с помощью Начать и конец ценить.
  • Rangelabels : ropp берет этикетки, чтобы показать ниже слайдера.
  • Showhistogram : это логический опоры, который показывает гистограмму с распределением данных. Здесь я установил это на ложь Так как он не нужен.

Теперь нам просто нужно подключить эти фильтры к Результаты составная часть. Мы просто должны обновить одну строку в Реактивист оказывается Результаты Компонент, чтобы включить ComponentIDID с этих компонентов.

Обновите реагировать опоры в Реактивист что мы оказали в Результаты составная часть:

const Results = () => (
  
);

Это должно сделать ваши результаты обновления для всех фильтров?

8. Обновление представления результатов

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

Мы будем использовать другой компонент внутри нашего Результаты Компоненты для визуализации разных тем.

Вот как вы можете создать свой собственный на /src/Компоненты/тема Отказ Не стесняйтесь добавить свой собственный вкус?

import React, { Component } from 'react';
import PropTypes from 'prop-types';

class Topic extends Component {
	handleClick = () => {
		this.props.toggleTopic(this.props.children);
	}
	render() {
		return (
			
#{this.props.children}
); } } Topic.propTypes = { children: PropTypes.string, active: PropTypes.bool, toggleTopic: PropTypes.func, }; export default Topic;

Этот компонент оказывает его дети и добавляет обработчик щелчка, чтобы переключить темы, которые обновляют steantopics Внутри главных Приложение Состояние компонента.

Далее нам просто нужно обновить наши Результаты Компонент в /src/Компоненты/Results.js :

import React from 'react';
import { SelectedFilters, ReactiveList } from '@appbaseio/reactivesearch';
import PropTypes from 'prop-types';

import Topic from './Topic';

const onResultStats = (results, time) => (
	
{results} results found in {time}ms
); const onData = (data, currentTopics, toggleTopic) => (
{data.description}
{ data.topics.slice(0, 7) .map(item => ( {item} )) }
{data.stars}
{data.forks}
{data.watchers}
); const Results = ({ toggleTopic, currentTopics }) => (
onData(data, currentTopics, toggleTopic)} onResultStats={onResultStats} react={{ and: ['language', 'topics', 'pushed', 'created', 'stars', 'forks', 'repo'], }} pagination innerClass={{ list: 'result-list-container', pagination: 'result-list-pagination', resultsInfo: 'result-list-info', poweredBy: 'powered-by', }} size={6} sortOptions={[ { label: 'Best Match', dataField: '_score', sortBy: 'desc', }, { label: 'Most Stars', dataField: 'stars', sortBy: 'desc', }, { label: 'Fewest Stars', dataField: 'stars', sortBy: 'asc', }, { label: 'Most Forks', dataField: 'forks', sortBy: 'desc', }, { label: 'Fewest Forks', dataField: 'forks', sortBy: 'asc', }, { label: 'A to Z', dataField: 'owner.raw', sortBy: 'asc', }, { label: 'Z to A', dataField: 'owner.raw', sortBy: 'desc', }, { label: 'Recently Updated', dataField: 'pushed', sortBy: 'desc', }, { label: 'Least Recently Updated', dataField: 'pushed', sortBy: 'asc', }, ]} />
); Results.propTypes = { toggleTopic: PropTypes.func, currentTopics: PropTypes.arrayOf(PropTypes.string), }; export default Results;

Я обновил Ондата Функция для оказания более подробных результатов. Вы также заметите новую SortOptions опоры в Реактивист Отказ Этот опоры принимает массив объектов, которые оказывают раскрывающееся меню, чтобы выбрать, как вы хотите отсортировать результаты. Каждый объект содержит этикетка Для отображения элемента списка A datafield Чтобы отсортировать результаты и A сортирование ключ, который может быть либо ASC (по возрастанию) или Desc (по убыванию).

Вот и все, ваш собственный репозиторий GitHub должен быть вжин!

Полезные ссылки

  1. Gitxplore приложение демонстрация , CodeSandbox и исходный код
  2. Реактивный поиск Github Repo.
  3. Реактивный поиск документы

Надеюсь, вам понравилась эта история. Если у вас есть мысли или предложения, пожалуйста, дайте мне знать и делиться своей версией приложения в комментариях!

Вы можете следовать за мной на Twitter Для последних обновлений. Я также начал публиковать более свежие сообщения на моем личном Блог Отказ

Оригинал: “https://www.freecodecamp.org/news/building-a-github-repo-explorer-with-react-and-elasticsearch-8e1190e59c13/”