powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / lucene 3.5.0, ejb3.1
14 сообщений из 14, страница 1 из 1
lucene 3.5.0, ejb3.1
    #37745429
breath
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
добрый день,
использую lucene 3.5.0, win7(x64), jdk 1.7.0_03-b05 (x86), glassfish 3.1.2.

из Directory получается юзать только RAMDirectory, все остальные которые FSDirectory(SimpleFSDirectory, NIOFSDirectory) при попытке обращения выдают

[#|2012-04-09T16:26:28.597+0400|SEVERE|glassfish3.1.2|lucene.Indexer|_ThreadID=102;_ThreadName=Thread-2;|index:new IndexWriter():
org.apache.lucene.store.LockObtainFailedException: Lock obtain timed out: NativeFSLock@D:\indexDir\write.lock
...

код такой,
находится в ejb3.1 бине(может это сказывается, хотя какого х)

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
@Singleton
@Startup
@LocalBean
@Lock(LockType.READ)
public class Indexer {
  @PostConstruct
  private void init() {
    db = (SearchDB) ctx.lookup("java:global/gorKassa/SearchDB");
    timerService = ctx.getTimerService();
    //timerService.createTimer(1400, 1400, null);
  }

  @PreDestroy
  private void destroy() {
    db = null;
    timerService = null;
  }

  @Timeout
  private void timerAction(Timer timer) {
    index();
    Logger.getLogger(SearchDB.class.getName()).log(Level.SEVERE, "@@@" + timer.getNextTimeout());
  }

  public void index() {
    Config conf = new Config();
    IndexWriterConfig config = new IndexWriterConfig(conf.getVersion(), conf.getAnalyzer());
    try {
      IndexWriter writer = new IndexWriter(conf.getDirectory(), config);
      writer.addDocument(new Document());
      writer.close();
      Logger.getLogger(Indexer.class.getName()).log(Level.SEVERE, "!!!" + writer);
    } catch (IOException e) {
      Logger.getLogger(Indexer.class.getName()).log(Level.SEVERE, "index:new IndexWriter():", e);
    }
  }



где class Config

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
public class Config {
  private String path = "/indexDir";

  public Version getVersion() {
    return Version.LUCENE_35;
  }

  public Directory getDirectory() {
    //return new RAMDirectory();
    return getFSDirectory();
  }

  public Analyzer getAnalyzer() {
    return new StandardAnalyzer(getVersion());
  }

  public String getIndexPath() {
    return path;
  }

  private Directory getFSDirectory() {
    Directory ret;
    File file = new File(path);
    try {
      ret = new SimpleFSDirectory(file);
      return ret;
    } catch (IOException e) {
      Logger.getLogger(Config.class.getName()).log(Level.SEVERE, "getFSDirectory:new NIOFSDirectory(file):" + "FS is RAM", e);
    }
    return new RAMDirectory();
  }
}


задумка такая что Indexer будет раз в сутки индексировать вьюшку db, по таймеру сейчас он закоментирован.
пробовал просто из кода вызывать index() без таймера метод, тоже самое.
...
Рейтинг: 0 / 0
lucene 3.5.0, ejb3.1
    #37745447
Leonidv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может просто файлик надо удалить? Код вроде нормальный.
...
Рейтинг: 0 / 0
lucene 3.5.0, ejb3.1
    #37745463
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
writer нужно закрывать в блоке finally
IndexWriterConfig и Config точно на каждый запрос надо пересоздавать?
Файловая система вообще не транзакционная.
Почему не использовать БД?
Там таймаут вообще настраивается?
...
Рейтинг: 0 / 0
lucene 3.5.0, ejb3.1
    #37745475
breath
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
точно, удалил write.lock и заработало, спасибо.
но не понял что это было ?

p.s с lucene только начал, и маленький оффтоп.
если index уже был создан, то при повторной переиндексации в тот же каталог замена/добавление будут производиться сами ? например из базы удалили инфу которая уже была в index или добавили новую которой еще нет в нем?
...
Рейтинг: 0 / 0
lucene 3.5.0, ejb3.1
    #37745486
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
breathточно, удалил write.lock и заработало, спасибо.
но не понял что это было ?

Выкинулся где-то exception, метод close() не вызвался - лок не удалился.
...
Рейтинг: 0 / 0
lucene 3.5.0, ejb3.1
    #37745498
breath
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,
>IndexWriterConfig и Config точно на каждый запрос надо пересоздавать?
это вобще пока не суть, так как это @Singleton можно конечно и в

@PostConstruct
private void init() {
db = (SearchDB) ctx.lookup("java:global/gorKassa/SearchDB");
timerService = ctx.getTimerService();
//timerService.createTimer(1400, 1400, null);
Config conf = new Config();
IndexWriterConfig config = new IndexWriterConfig(conf.getVersion(), conf.getAnalyzer());
}

>Файловая система вообще не транзакционная.
Почему не использовать БД?

всмысле индексы хранить в db ? вобще хранение индексов в файлах, я думал как раз разгружает базу(можно конечно создать новую отдельную от основной базу для индексов и в ней хранить, решается заодно вопрос кластеризации индексов(записей в базе) средствами oracle), где то читал что есть jdbc directory, но для этого нужно прикручивать какой то левый фрамеворк.. не очень пока хотелось.

поэтому остановился на файлах, они по любому быстрее чем db мне кажется, особенно NIOFSDirectory.
...
Рейтинг: 0 / 0
lucene 3.5.0, ejb3.1
    #37745507
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
breathони по любому быстрее чем db мне кажется
:)
Ну, ОК.
...
Рейтинг: 0 / 0
lucene 3.5.0, ejb3.1
    #37745508
breath
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хм, ну если не прав в этом, Вы скажите.. )
...
Рейтинг: 0 / 0
lucene 3.5.0, ejb3.1
    #37745512
breath
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и плюс, подумал что каталог с индексами можно кластеризировать например средсвами glusterfs
...
Рейтинг: 0 / 0
lucene 3.5.0, ejb3.1
    #37745520
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
breathхм, ну если не прав в этом, Вы скажите.. )
Очень много разных факторов. Скачать однозначно что что-то одно быстре - нельзя:
https://issues.apache.org/jira/browse/LUCENE-724
http://wiki.apache.org/lucene-java/ImproveSearchingSpeed
...
Рейтинг: 0 / 0
lucene 3.5.0, ejb3.1
    #37745594
Leonidv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
breathи плюс, подумал что каталог с индексами можно кластеризировать например средсвами glusterfs
У Lucene в контрибах есть поддержка простейшего распределенного индекса.
...
Рейтинг: 0 / 0
lucene 3.5.0, ejb3.1
    #37745772
breath
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
спасибо посмотрю, а что имеется ввиду под ? (простейшего..)
>простейшего распределенного индекса.
...
Рейтинг: 0 / 0
lucene 3.5.0, ejb3.1
    #37745836
Leonidv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
breathспасибо посмотрю, а что имеется ввиду под ? (простейшего..)
>простейшего распределенного индекса.
Я думаю, что там просто разбивка по сегментам, которые лежат на разных машинах. Запрос уходит на несколько машин, а потом объединяется.
Посмотрите на solr - возможно, он для ваших задач лучше подойдет.
...
Рейтинг: 0 / 0
lucene 3.5.0, ejb3.1
    #37745891
breath
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
solr будет тут избыточен возможно, мне не нужен отдельный поисковый сервер.

система, как мне думалось будет такая, glassfish настраивается на работу в кластере с балансировщиком нагрузки(в glassfish этот функционал, как почитал, идет из коробки), в качестве db - oracle, у него тоже есть стандартные инструменты для кластеризации данных.

чтобы не искать постоянно в db(планируются очень высокие нагрузки), lucene будет индексировать нужные таблицы(точнее вьюшки) с каким то интервалом, и поиск будет только по индексам. (в db будут искать только админы, все остальные в lucene index). то есть логика приложения(ejb бины в кластере), данные(oracle в кластере), остаются индексы(если упадет один из сервков то нужно чтобы другой тоже имел копию index). прикинув все возможные варианты, показалось что с glusterfs можно решить этот вопрос с индексами

интересно что думаете, может кто делал похожий функционал.

спасибо.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / lucene 3.5.0, ejb3.1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]