powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / lucene, поиск в индексе с учетом предыдущего ввода
3 сообщений из 3, страница 1 из 1
lucene, поиск в индексе с учетом предыдущего ввода
    #37800917
breath
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
поиск в индексе с учетом предыдущего ввода,

Indexer:
сначала индексируется вьюшка из бд таким образом;

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
   List<TerminObject> terminObjectList = db.selectAllFromMvSearchView();
      for (TerminObject terminObject : terminObjectList) {
        Document document = new Document();
        //todo : string to numeric, document.add(new NumericField("id").setIntValue(terminObject.getId()));
        document.add(new Field("id",  String.valueOf(terminObject.getId()), Field.Store.YES, Field.Index.ANALYZED));
        document.add(new Field("kind", terminObject.getKind(), Field.Store.YES, Field.Index.ANALYZED));
        document.add(new Field("text", terminObject.getText(), Field.Store.YES, Field.Index.ANALYZED));
        writer.addDocument(document);
        ret++;
      }


в kind храниться тип объекта, там может быть (kind1, kind2, kind3, kind4...)
в text сам текст, по которому происходит поиск.

Searcher:

Код: 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.
 public List<TerminObject> doSearch(List<TerminObject> terminObjects, int idx) {
    List<TerminObject> ret = new ArrayList();
    String str = terminObjects.get(idx).getText();
    if (null != str && str.trim().length() >= 2) {
      try {
        ScoreDoc[] scoreDocs = luceneSearch(str);
        for(int i = 0; i < scoreDocs.length; i++){
          Document document = indexSearcher.doc(scoreDocs[i].doc);
          TerminObject object = new TerminObject();
          object.setId(Integer.parseInt(document.get("id")));
          object.setText(document.get("text"));
          object.setKind(document.get("kind"));
          ret.add(object);
        }
      } catch (IOException | ParseException e) {
        Logger.getLogger(Searcher.class.getName()).log(Level.SEVERE, "luceneSearch: ", e);
      }
    }
    return ret;
  }

  private ScoreDoc[] luceneSearch(String str) throws IOException, ParseException {
    Query q = new QueryParser(config.getVersion(), "text", config.getAnalyzer()).parse(str + "*");
    TopScoreDocCollector collector = TopScoreDocCollector.create(100, true);
    indexSearcher.search(q, collector);
    ScoreDoc[] hits = collector.topDocs().scoreDocs;
    return hits;
  }



например где то юзер вводит такой поисковый запрос, 'foo' (далее он преобразуется в json) и в метод doSearch
передается такое {text:'foo', kind:'any kind'}]&i=0
находится все что есть в индексе в поле text и начинается на foo*, индекc i=0

если же хотим найти последовательность и юзер вводит сначала 'foo' потом через пробел 'foo1'
преобразуется в {text:'foo', kind:'xxx'},{text:'foo1', kind:'yyy'},...]&i=1

с таким механизмом, просто меняем i=1 и ищем что начинается на foo1*, то есть предыдущий foo никак
не учитывается.

пока пришел вариант делать промежуточные индексы в RAMDirectory, и потом искать в нем foo1, но делать так
на каждый запрос юзера кажется будет накладно, даже если учесть что класс Searcher является @Stateless
бином.

или тут нужно использовать multiphrasequery ?

спасибо.
...
Рейтинг: 0 / 0
lucene, поиск в индексе с учетом предыдущего ввода
    #37801179
Leonidv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
breath,

Я честно пытался поменять, что вы хотите сделать, и не понял. Догадываюсь, что вы хотите делать поиск в результатах предыдущего ответа (фича искать в найденном)?
...
Рейтинг: 0 / 0
lucene, поиск в индексе с учетом предыдущего ввода
    #37801269
breath
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как должно быть,
юзер вводит 'маши..'
ему выдается авто дополненный список слов которые есть в индексе с началом слова 'маши', например 'машина' и какие то еще слова, он выбрал вариант 'машина' и далее еще вводит
'ми..', выдается список машин, которые начинаются на 'ми', мицубиси, миникупер и тд.., получается как в гугле.

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


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