Профиль пользователя заблокирован сроком с 24 марта 2024 г. и навсегда по причине: систематические нарушения пункта 5.2 правил сервиса
  • Как сделать методы класса доступными только для одного класса?

    @My1Name Автор вопроса
    Оставил class DAO без модификатора доступа. Теперь он доступен только в одном packege.
    Написано
  • Как взаимодействуют компоненты в проекте Java + Spring?

    @My1Name
    Думаю ответ на все эти вопросы - Multithreading. Фреймворк Spring собирает интерфейсы, а все наши методы классов выполняются в его стриме. Мы не можем влазить в Runtime фреймворка, и он в свою очередь не видит наши классы. То есть классов может быть много, но все они наследуют логику сервлета через интерфейс.

    P.s. Это сугубо моё предложение.
    Написано
  • Какие символы разрешены в email?

    @My1Name Автор вопроса
    Adamos,
    нетривиальная опасность: настроить более широкие ограничения по адресу, чем у почтового сервера провайдера

    Судя по количеству примеров и рекомендаций в интернете, я ориентируюсь на SMTP-сервер GMail
    Написано
  • Какие символы разрешены в email?

    @My1Name Автор вопроса
    Adamos,
    Стоит указывать, что такого символа в почте не должно быть.

    Это понятно. Вопрос в том, каких символов не должно быть? Было бы здорово написать их все в один список.
    Написано
  • Какие символы разрешены в email?

    @My1Name Автор вопроса
    Василий Банников, Нет смысла что либо запрещать?
    Написано
  • Как правильно создать БД в одном execute?

    @My1Name Автор вопроса
    сергей кузьмин, да, спасибо, вполне годный ответ. Я в другой ветке комментариев написал приблизительно тоже самое...
    Написано
  • Как правильно создать БД в одном execute?

    @My1Name Автор вопроса
    Дмитрий, Правильный ответ выглядит приблизительно так:
    jdbcTemplate.execute("CREATE DATABASE IF NOT EXISTS usersdb;");
    jdbcTemplate.execute("USE usersdb;");
    jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS users"+
       "(id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,"+
       "email TINYTEXT NOT NULL,"+
       ....................
       "UNIQUE KEY(email));");

    В конце запроса ставится точка с запятой. При этом MySQL-сервер не умеет выполнять группы запросов, разделённых таким образом. То есть объединение в один execute не имеет смысла.

    При создании новой базы данных, желательно (но не обязательно) указывать набор символов и параметры сортировки данных. Example:
    CREATE DATABASE [IF NOT EXISTS] database_name
    [CHARACTER SET charset_name]
    [COLLATE collation_name]

    Если не указывать CHARACTER и COLLATE, эти параметры будут созданы MySql поумолчанию, что собственно удовлетворяет большинство потребностей.

    Если необходимо сделать поле email уникальным, в MySQL для этих целей есть UNIQUE INDEX (синоним UNIQUE KEY). https://www.mysqltutorial.org/mysql-unique/
    Написано
  • Почему поиск FuzzyQuery (Apache Lucene) ничего не возвращает?

    @My1Name Автор вопроса
    Example (fuzzy search):
    Query query = new QueryParser(searchField, new StandardAnalyzer()).parse(querystr);

    Для многоязыковой поддержки, нужно написать свой Analyzer
    Написано
  • Почему поиск FuzzyQuery (Apache Lucene) ничего не возвращает?

    @My1Name Автор вопроса
    mayton2019, с кириллицей (ru) оно пока-что вообще не работает...
    import java.io.IOException;
    import java.nio.file.Paths;
    import java.util.Scanner;
    
    import org.apache.lucene.analysis.standard.StandardAnalyzer;
    import org.apache.lucene.document.Document;
    import org.apache.lucene.document.Field;
    import org.apache.lucene.document.TextField;
    import org.apache.lucene.index.DirectoryReader;
    import org.apache.lucene.index.IndexReader;
    import org.apache.lucene.index.IndexWriter;
    import org.apache.lucene.index.IndexWriterConfig;
    import org.apache.lucene.index.Term;
    import org.apache.lucene.queryparser.classic.ParseException;
    import org.apache.lucene.queryparser.classic.QueryParser;
    import org.apache.lucene.search.FuzzyQuery;
    import org.apache.lucene.search.IndexSearcher;
    import org.apache.lucene.search.Query;
    import org.apache.lucene.search.ScoreDoc;
    import org.apache.lucene.search.TopDocs;
    import org.apache.lucene.store.Directory;
    import org.apache.lucene.store.FSDirectory;
    
    public class Main {
    
    	static final String path = "C:\\Users\\TMP\\";
    	static final String title = "Hello World!";
    	static final String body = "Пример двуязычной записи и поиск...";
    	static Directory dir;
    	public static void main(String[] args) throws IOException, ParseException {
    		
    		StandardAnalyzer analyzer = new StandardAnalyzer();
    		dir = FSDirectory.open(Paths.get(path));
    		IndexWriterConfig config = new IndexWriterConfig(analyzer);
    		// Create a new index in the directory, removing any
    		config.setOpenMode(IndexWriterConfig.OpenMode.CREATE);
    		IndexWriter w = new IndexWriter(dir, config);
    		addDoc(w, title, body);
    		addDoc(w, "Lucene in Action", "193398817");
    		addDoc(w, "Managing Gigabytes", "55063554A");
    		addDoc(w, "The Art of Computer Science", "9900333X");
    		w.close();
    
    		String encoding = System.getProperty("console.encoding", "utf-8");
    		Scanner sc = new Scanner(System.in, encoding);
    		while (true) {
    			System.out.print("ведите запрос:\t");
    			String querystr = sc.nextLine(); 
    			fuzzySearch(querystr, "title", 2);
    		}
    	}
    
    	private static void addDoc(IndexWriter w, String title, String body) throws IOException {
    		Document doc = new Document();
    		doc.add(new TextField("title", title, Field.Store.YES));
    		doc.add(new TextField("body", body, Field.Store.YES));
    		w.addDocument(doc);
    	}
    
    	public static void fuzzySearch(final String querystr, final String searchField,
    			final int limit) throws IOException, ParseException {
    		IndexReader reader = DirectoryReader.open(dir);
    		IndexSearcher indexSearcher = new IndexSearcher(reader);
    		Term term = new Term(searchField, querystr);
    		int maxEdits = 2; // minimum symbols in query
    		Query query = new FuzzyQuery(term, maxEdits);
    		TopDocs search = indexSearcher.search(query, limit);
    		ScoreDoc[] hits = search.scoreDocs;
    		showHits(hits);
    	}
    
    	private static void showHits(ScoreDoc[] hits) throws IOException {
    		IndexReader reader = DirectoryReader.open(dir);
    		if (hits.length == 0) {
    			System.out.println("\n\tНичего не найдено");
    			return;
    		}
    		System.out.println("\n\tРезультаты поиска:");
    		for (ScoreDoc hit : hits) {
    			final String title = reader.document(hit.doc).get("title");
    			final String body = reader.document(hit.doc).get("body");
    			System.out.println("\n\tDocument Id = " + hit.doc + "\n\ttitle = " + title + "\n\tbody = " + body);
    		}
    
    	}
    }
    Написано
  • Почему поиск FuzzyQuery (Apache Lucene) ничего не возвращает?

    @My1Name Автор вопроса
    mayton2019,
    нет прондексированных документов в reader.

    Всё есть. Но в таком виде, метод работает только при 100% совпадении или при передаче запроса длиной в 1-2 символа. То есть оно вообще не fuzzy search... То ли термы не создаются, то ли я не знаю почему, но оно не работает как "нечёткий поиск".
    Написано
  • Можно ли использовать Elasticsearch для поиска в файлах?

    @My1Name Автор вопроса
    Kentavr16, Спасибо. Мне не нравится идея - использовать БД для работы с небольшими файлами. Особенно если ещё ставить "сверху" поисковый движок... Я думаю для таких задач нужен просто хороший парсер. И я пока что остановил свой взор на Apache Lucene.

    По поводу
    скл-подобной бд - в сотни раз быстрее

    - Сомневаюсь. Потому-что перебирая документ по индексам, например через indexOf() основную часть времени забирает чтение файла. Если читать файл не построчно, а как массив байтов, например через readAllBytes() то поиск происходит в оперативной памяти (в стриме). То есть скорость зависит фактически от железа, ну и разумеется от алгоритмов выборки.
    Написано
  • Можно ли использовать Elasticsearch для поиска в файлах?

    @My1Name Автор вопроса
    Иерокопус Таманский, Apache Lucene похоже то, что надо.. Читаю на habr.
    Написано
  • Можно ли использовать Elasticsearch для поиска в файлах?

    @My1Name Автор вопроса
    Спасибо. Интересно. Но неужели нет ничего подобного для работы непосредственно с файлами? - Устанавливать СУБД, а сверху ещё и поисковый движок для работы с небольшими данными, звучит как-то абсурдно. Они займут больше места, чем весь проект.

    p.s. Я думал Elasticsearch можно добавить в виде .jar файла и использовать как хороший парсер текста.
    Написано
  • Можно ли использовать Elasticsearch для поиска в файлах?

    @My1Name Автор вопроса
    Kentavr16,
    Скорость поиска в тексте наверняка О(n)

    Точный поиск в файле до 10Мб - осуществляется в пределах 1 секунды.
    Написано
  • Можно ли использовать Elasticsearch для поиска в файлах?

    @My1Name Автор вопроса
    Иерокопус Таманский, В реальности файл гораздо меньше. Он где-то 10Мб (Max) и перезаписывается подобно стеку: Первый зашёл - первый ушёл. Дозапись в конец файла с фиксированным количеством текстовых блоков.
    Написано
  • Можно ли использовать Elasticsearch для поиска в файлах?

    @My1Name Автор вопроса
    Иерокопус Таманский,
    если запись в этот файл подконтрольна
    - Да. Запись подконтрольна.

    можно предложить другое решение для индексации текста

    - Какое? Когда я написал "Я знаю как осуществить поиск в таком файле с помощью JAVA", я подразумевал поиск в стриме. Проблема в том, что так можно искать только точные совпадения. То есть ошибки в параметрах поиска и тем более транслитерация - недопустимы. Иначе нужно писать свой "поисковый движок"...
    Написано
  • Можно ли использовать Elasticsearch для поиска в файлах?

    @My1Name Автор вопроса
    Иерокопус Таманский, Обычная запись/перезапись в файл. Исходники можете найти в интернете.
    Написано
  • Можно ли использовать Elasticsearch для поиска в файлах?

    @My1Name Автор вопроса
    В Elasticsearch нужно загружать файл для создания индексов? - У меня динамический файл (не 100, а где-то 10Mb в реальности). Он постоянно видоизменяется (перезаписывается как стэк, типа LinkedList). В общем с Elasticsearch ничего не понятно... Реляционные БД, я думаю тоже не подходят для такой задачи.
    Написано
  • Как оптимизировать return выражение?

    @My1Name
    Что это? Какие тесты? Вопрос из разряда безразрядный...
    Написано
  • Почему берет одну запись по селектору?

    @My1Name
    Принципиально vanilla, или jQuery тоже норм? На жуйкури будет более правильно взять <tbody> Ещё лучше с id и добавить проверку через contains.
    Написано