andmobi-Search: основанный на Lucene лёгкий распределённый поисковый движок
Интеграция с Lucene, не требуется сложная конфигурация, готов к использованию сразу после распаковки.
Предоставление объектно-ориентированного интерфейса Lucene API. Использование аннотаций для определения сущностей (включая поля, создание индексов, веса, использование для поиска и выделение). Работа с индексами через интерфейс сервиса andmobi-search для добавления, изменения, удаления и поиска.
Поддержка выделения.
Упрощение разбиения на страницы в Lucene.
Поддержка функций статистической группировки.
Кластер Lucene: Поддержка структуры синхронизации индексов «один мастер — несколько подчинённых» (1-master n-slave). Управление состоянием узлов кластера.
-----------
Импорт пакетов и настройка файлов
-----------
//Jar-пакеты:
//1. andmobi-search.jar // найти в каталоге release
//или использовать сторонний Maven-репозиторий Oschina, см. http://maven.oschina.net/help.html
<dependency>
<groupId>com.andmobi</groupId>
<artifactId>search</artifactId>
<version>1.0.1</version>
<type>pom</type>
</dependency>
//2. IKAnalyzer2012_hf.jar (в каталоге libs, IK-токенизатор)
//3. Jar-пакеты Lucene 4.3, см. ссылки на проекты в pom.xml
//Файлы конфигурации:
search.properties
//lucene-local-impl: com.andmobi.search.service.impl.LuceneSearchServiceImpl
//lucene-cluster-impl: com.andmobi.search.service.impl.LuceneClusterServiceImpl
//Выбор класса поискового движка для использования в односерверном / кластерном режиме
searcher=com.andmobi.search.service.impl.LuceneClusterServiceImpl
//Включить или отключить подсветку on|off
highlight=on
highlight.pre=<span class=\\"highLight\\">
highlight.ext=</span>
//Каталог хранения индексов
lucene.indexDir=H:/tmp/search/test
-----------
Определение сущности
-----------
@SearchEntity(searchFields={"author","content","type"},idFiled="name")
public class SearchTestEntity {
@SearchColum(name="author", index = true, store = true)
private String author;
@SearchColum(index =true, store = true,highLight = true)
private String content;
@SearchColum(index =true,name="name", store = true)
private String name;
@SearchColum(index =true,name="type", store = true)
private String type;
-----------
Тестирование
-----------
public class SearchTest {
//Инициализация поискового сервиса
private SearchService service = andmobiSearcher.getService();
/**
* Создание индекса: файл конфигурации resources/search.properties -indexDir: путь к файлу индекса на диске
* Здесь поле name используется как уникальный логический идентификатор (первичный ключ) индекса
*/
@Test
public void create() {
List<SearchTestEntity> books = new ArrayList<SearchTestEntity>(10);
SearchTestEntity s1 = new SearchTestEntity("小说","罗贯中","本书是中国古典四大名著之一,全名为《三国志通俗演义》。作者是元末明初小说家罗贯中,是中国第一部长篇章回体历史演义小说。描写了从东汉末年到西晋初年之间近105年的历史风云。全书反映了三国时代的政治军事斗争,反映了三国时代各类社会矛盾的转化,并概括了这一时代的历史巨变,塑造了一批叱咤风云的三国英雄人物。\n" +
"自《三国演义》问世以来,各式各样的版样层出不穷,明代刻本有20多种,清代刻本也有70多种,在中国民间流传甚广。康熙二十八年,日僧湖南文山编译出版日文本《通俗三国志》之后,朝鲜、日本、印度尼西亚、越南、泰国、英国、法国、俄国等许多国家都对《三国演义》有本国文字的译本,并发表了不少研究论文和专著,对这部小说作出了极高的评价。","三国演义");
SearchTestEntity s2 = new SearchTestEntity("哲学","王阳明","本书是哲学著作,作者是中国明代哲学家、宋明道学中心学一派的代表人物王守仁(字伯安),世称阳明先生。此书记载了他的语录和论学书信。传习一辞源出自《论语》中的传不习乎一语。","传习录");
SearchTestEntity s3 = new SearchTestEntity("小说","石悦","明朝那些事儿,本书是网络连载的历史小说,作者是当年明月,本名石悦,广东顺德海关公务员。[2] 2006年3月在天涯社区首次发表,2009年3月21日连载完毕,边写作边集结成书出版发行,一共7本[3] 。","明朝那些事儿");
SearchTestEntity s4 = new SearchTestEntity("传记","陈梧桐","本书是一部人物传记,运用了丰富扎实的史料,生动流畅的文笔,全面记述了中国历史上的杰出政治家和军事家明太祖朱元璋从贫苦出身的小行童到元末农民起义领袖,再到明朝开国皇帝的传奇经历和主要活动,是一部具有重要学术价值和较强可读性的历史著作。","洪武大帝朱元璋传");
SearchTestEntity s5 = new SearchTestEntity("未知","佚名","本书是一部","不知道");
books.add(s1);
books.add(s2);
books.add(s3);
books.add(s4);
books.add(s5);
try {
service.createOrUpdateIndexBatch(books);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* Поиск по ключевым словам — без разбивки на страницы. Поиск по ключевым словам поддерживает синтаксис Lucene
*/
@Test
public void search() {
try {
SearchResult<SearchTestEntity> r = service.findSearchResult(
com.andmobi.junit.SearchTestEntity.class, "明朝");
System.out.println(r.getSize());
for(SearchTestEntity t:r.getResult()){
System.out.println(t);
}
} catch (CorruptIndexException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ParseException e) {
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
}}
``` **Поиск по ключевым словам — постраничный**
*Поддержка синтаксиса Lucene*
@Test public void searchPage() { try { SearchResult r = service.findSearchResult( com.andmobi.junit.SearchTestEntity.class, "明朝", 1, 1); System.out.println(r.getSize()); for (SearchTestEntity t : r.getResult()) { System.out.println(t); } } catch (CorruptIndexException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (ParseException e) { e.printStackTrace(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } }
**Групповая статистика**
*По типу книги — количество и название книг*
@Test public void group(){ try { GroupResult groupResult = service.group(SearchTestEntity.class, "本书", "type", "name", 10000); System.out.println( groupResult.getCountMap()); //Вывод результата: {传记=1, 哲学=1, 小说=2, 未知=1} } catch (Exception e) { e.printStackTrace(); } }
**Обновление индекса**
@Test public void update() { SearchTestEntity s5 = new SearchTestEntity("小说","佚名","本书是一部小说","围城"); try { service.createOrUpdateIndex(s5); } catch (Exception e) { e.printStackTrace(); } search(); }
**Удаление индекса**
@Test public void del() { SearchTestEntity s5 = new SearchTestEntity(); s5.setName("围城"); try { service.deleteIndex(s5); } catch (Exception e) { e.printStackTrace(); } search(); }
---------------------------
**Конфигурация кластера — копирование индекса**
---------------------------
Добавление конфигурации кластера в web.xml
```Xml
<servlet>
<servlet-name>andmobiSearch</servlet-name>
<servlet-class>com.andmobi.search.cluster.ClusterServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>andmobiSearch</servlet-name>
<url-pattern>/manager</url-pattern>
</servlet-mapping>
Изменение файла конфигурации search.properties
//Изменение класса реализации на кластерный режим
searcher=com.andmobi.search.service.impl.LuceneClusterServiceImpl
//Режим кластера
//Главный узел master, подчиненный узел slave
lucene.cluster.mode=master
//Путь синхронизации журнала в режиме кластера
lucene.cluster.logbase=H:/tmp/search/node1/log
//IP и порт этого компьютера (используйте этот порт в качестве порта связи между узлами)
lucene.cluster.me=127.0.0.1:9990
//Конфигурация узла (несколько узлов разделяются запятыми, подчиненные узлы могут быть пустыми)
lucene.cluster.group=127.0.0.1:9991
//Интервал публикации журнала (в миллисекундах)
lucene.cluster.period.pub=60000
//Интервал повторного выполнения журнала (в миллисекундах)
lucene.cluster.period.redo=60000
//Период проверки пульса (в миллисекундах)
lucene.cluster.period.heartbeat=60000
//Интервал повторной попытки после ошибки (в миллисекундах)
lucene.cluster.period.pubFromError=60000
После развертывания главного узла можно просмотреть состояние узлов кластера через http://localhost:8080/andmobi-search/manager?page=index
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )