Я помню, что учитель Java однажды задал вопрос об собеседовании на Baidu, что примерно означает «есть 10 000 беспорядочных записей, как быстро найти записи, которые вы хотите от них». Это эквивалентно простой поисковой системе. Недавно я уже понял это в работе, которую я разобрал в этом году. Сегодня я поделюсь с вами дальше абстрагировать это.
Сначала напишите конкретный код реализации и напишите конкретные идеи реализации и логику после кода.
Бобы, используемые для сортировки во время поиска
/ ** *@Описание: */ package cn.lulei.search.engine.model; открытый класс SortBean {Private String ID; частное время; public String getId () {return id; } public void setId (String id) {this.id = id; } public int getTimes () {times times; } public void Cettimes (int Times) {this.Times = times; }} Созданная структура данных поиска и простой алгоритм поиска
/ ** *@Описание: */ Пакет cn.lulei.search.engine; импортировать java.util.arraylist; импортировать java.util.collections; Импорт java.util.comparator; импортировать java.util.hashmap; импортировать java.util.hashset; импортировать java.util.list; Импорт cn.lulei.search.engine.model.sortbean; открытый класс Serachbase {// Подробности хранить подробную информацию об объектах поиска, где ключ - это уникальный идентификатор, чтобы отличить объект Private Hashmap <String, Object> Details = new HashMap <String, Object> (); // Для ключевых слов, участвующих в поиске, разреженное хранилище массива, используемое здесь, также можно хранить с помощью HashMap. Формат определения выглядит следующим образом // Частный статический Hashmap <Integer, Hashset <String >> keySearch = new Hashmap <Integer, Hashset <String >> (); // Значение ключа среды HashMap эквивалентно индексу в разреженном массиве, и значение эквивалентно значению разреженного массива в этой позиции частной конечной статической статической int maxlength = parmate.max_value; @Suppresswarnings ("unchecked") частный хэшсет <string> [] keysearch = new Hashset [maxlength]; / ***@Описание: Реализовать режим Singleton, используя инициализацию на держателе спроса для загрузки*@версии: 1.1.0*/ private static class lazyloadserachbase {private static final serachbase serachbase = new serachbase (); } / *** Режим Singleton установлен на частную функцию здесь* / private serachbase () {} / *** @return* @description: Get singleton* / public static serachbase getserachbase () {return lazyloadserachbase.serachbase; } / ** * @param id * @return * @description: получить подробную информацию на основе идентификатора * / public object getObject (string id) {return details.get (id); } / ** * @param ids * @return * @description: Получить детали на основе идентификаторов, разделяйте идентификаторы с "," * / public list <object> getObjects (String Ids) {if (ids == null || "" .equals (ids)) {return null; } List <object> objs = new ArrayList <Object> (); String [] iDarray = ids.split (","); для (идентификатор строки: idarray) {objs.add (getObject (id)); } вернуть objs; } / ** * @param key * @return * @description: Найдите соответствующий идентификатор в соответствии с членами поиска и используйте "," разделить между идентификаторами * / public String getIds (String Key) {if (key == null || ". .Equals (key)) {return null; } // Найти // idtimes хранит, появляется ли каждый символ в поисковом термине в идентификаторе в идентификаторе. idtimes = new Hashmap <String, Integer> idTimes = new HashMap <String, Integer> (); // IDS хранит идентификатор символов в поисковом термине. Hashset <string> ids = new Hashset <string> (); // поиск для (int i = 0; i <key.length (); i ++) {int at = key.charat (i); // В поисковом термине нет соответствующего символа. Затем сопоставьте следующий символ if (keysearch [at] == null) {продолжить; } for (Object obj: keySearch [at] .toarray ()) {string id = (string) obj; int times = 1; if (ids.contains (id)) {times += idtimes.get (id); idtimes.put (id, times); } else {ids.add (id); idtimes.put (id, times); }}} // sort с списком массива <sorkbean> sortbeans = new ArrayList <sortbean> (); for (String id: ids) {sortbean sortbean = new sortbean (); sortbeans.add (sortbean); sortbean.setid (id); sortbean.setTimes (idtimes.get (id)); } Collections.sort (sortbeans, new Comparator <SortBean> () {public int compare (sortbean o1, sortbean o2) {return o2.getTimes () - o1.getTimes ();}}); // Создание возврата String StringBuffer sb = new StringBuffer (); для (sortbean sortbean: sortbeans) {sb.append (sortbean.getid ()); SB.Append (","); } // Выпустить ресурс idtimes.clear (); idtimes = null; ids.clear (); ids = null; sortbeans.clear (); sortbeans = null; // return return sb.toString (); } /** * @param id * @param searchkey * @param obj * @description: добавить историю поиска * /public void Add (String Id, String SearchKey, Object obj) {// Параметры частично пусты и не загружайте, если (id == null || searchkey == null || obj == null) {return; } // Сохранить Defity.put (id, obj); // Сохранить поисковый термин AddSearchKey (id, SearchKey); } /** * @param id * @param searchKey * @Description: Add search terms to the search domain*/ private void addSearchKey(String id, String searchKey) { //Separate parameters are empty and not loaded//This is a private method, and the following judgment can be made, but for the sake of design specifications, if (id == null || searchKey == null) { return; } // Следующее причастие персонажа. Здесь вы также можете использовать другие зрелые причастия слова для (int i = 0; i <searckey.length (); i ++) {// значение at эквивалентно подсказке массива, а хэшсет, состоящий из идентификатора, эквивалентно значению Array int at at = search.charat (i); if (keysearch [at] == null) {hashset <string> value = new Hashset <string> (); KeySearch [at] = value; } KeySearch [at] .Add (id); }}} Тестовые примеры:
/ ** *@Описание: */ Пакет cn.lulei.search.engine.test; импортировать java.util.list; Импорт cn.lulei.search.engine.serachbase; открытый тест класса {public static void main (string [] args) {// todo Автогенерированный метод stub serachbase serachbase = serachbase.getserachbase (); serachbase.add ("1", "Привет!", "Привет!"); serachbase.add ("2", "Привет! Я Чжан Сан". "Привет! Я Чжан Сан."); serachbase.add («3», «Погода сегодня довольно хороша»); serachbase.add («4», «Кто ты?», «Кто ты?»); serachbase.add («5», «предмет продвинутой математики сложно», «высокая математика действительно сложно».); serachbase.add («6», «тест», «вышеупомянутый тест»); String ids = serachbase.getids («Ваша высокая математика»); System.out.println (ids); Список <object> objs = serachbase.getObjects (ids); if (objs! = null) {for (Object obj: objs) {System.out.println ((String) obj); }}}} Результаты результатов вывода теста следующие:
5, 3, 2, 1, 4, более высокие числа действительно сложно. Погода сегодня довольно хорошая. Привет! Я Чжан Сан. Привет! Кто ты?
Такая простая поисковая система считается завершенной.
Вопрос 1: Слово причастие здесь использует причастие персонажа, которое довольно хорошо обрабатывает китайский язык, но оно очень слаб в обращении с английским языком.
Метод улучшения: используйте текущий метод сегментации зрелых слов, такой как ikanalyzer, Standardanalyzer и т. Д. Таким образом, необходимо изменить структуру данных KeySearch, что может быть изменено на частную Hashmap <String, String> [] keySearch = new Hashmap [maxLength]; где ключ хранит слово элемент детали, а значение хранит уникальный идентификатор идентификатора.
Вопрос 2: Поисковая система, реализованная в этой статье, не устанавливает веса для элементов слов, таких как Lucene, а просто определяет, появляются ли элементы слова в объекте.
Метод улучшения: пока нет. Добавление обработки веса делает структуру данных более сложной, поэтому она не была обработана в настоящее время, а обработка веса будет реализована в будущих статьях.
Давайте кратко представим идеи реализации поисковых систем .
Установите два свойства деталей и KeySearch в классе Serachbase. Детали используются для хранения подробной информации объекта, а KeySearch используется для индексации домена поиска. Формат данных деталей является Hashmap, а формат данных KeySearch - это разреженный массив (также может быть HashMap, значение ключа среднего HashMap эквивалентно индексу в разреженном массиве, и значение эквивалентно значению разреженного массива в этой позиции).
Я не дам слишком много знакомства с деталями.
Метод вычисления подписаний массива в KeySearch (например, HashMap - это ключ) - получить первое значение int int int int value inement (потому что слово «Причастие» в этой статье использует причастие символов, поэтому символ - это элемент слова). Значение int - это индекс массива, а соответствующее значение массива является уникальным идентификатором объекта. Таким образом, структура данных KeySearch заключается в следующем
Поэтому, когда вы хотите добавить новую запись, вам нужно только вызвать метод добавления.
Логика реализации для поиска аналогична приведенной выше KeySearch. Для поиска ID просто используйте метод получения HashMap. Для поиска поисковых терминов общий процесс также использует сегментацию слов, сначала запрос, и сортируется последним. Конечно, слово причастие здесь должно соответствовать словному причастию, используемому для создания (то есть причастие персонажа используется при создании, а причастие персонажа также используется при поиске).
В методе GetIDS HashMap <String, Integer> idTimes = new Hashmap <String, Integer> (); переменная idTimes используется для хранения того, сколько элементов слов в поисковом конце отображается в KeySearch. Значение ключа - это уникальный идентификатор идентификатора, а значение - это количество появляющихся элементов слова. Hashset <string> ids = new Hashset <string> (); Переменная IDS используется для хранения идентификаторов возникновения слова. Сложностью поиска таким образом является количество элементов слова n поискового термина. Получите идентификаторы, содержащие элементы слова, постройте массив сортировки и сортируйте его. Правило сортировки состоит в том, чтобы порядок убывания количества элементов слов. Наконец, строка IDS возвращается, и каждый идентификатор разделен на «». Если вы хотите получить подробную информацию, используйте метод GetObjects.
Выше приведено просто простая поисковая система и не разработала слишком много методов расчета. Я надеюсь, что это вдохновит всех.