как правилно да избягам от lucene заявка?

Аз съм съвсем нов в Lucene и наскоро се натъкнах на проблем. Имам документ на lucene, който изглежда така:

--- type ---
gene
--- id ---
xla:379474
--- alt_id ---
emb:BC054227
gb:BC054227
ncbi-geneid:379474
ncbi-gi:148230166
rs:NM_001086315
rs:NP_001079784
unigene:Xl.24622
xla:379474

Създадох заявката по-долу, за да извлека този документ. Работи добре за altId = 379474, но не и за altId = ncbi-geneid:379474 или Xl.24622. Предположих, че altId трябва да бъде екраниран и опитах String altId = QueryParser.escape(altId) без успех. Това ли е очакваното поведение на заявката?, пропускам ли нещо?

Query query1 = new TermQuery(new Term("type", "gene"));
Query query2 = new TermQuery(new Term("alt_Id", altId));

BooleanQuery query = new BooleanQuery();
query.add(query1, BooleanClause.Occur.MUST);
query.add(query2, BooleanClause.Occur.MUST);

Между другото, използвам lucene v3.0.


person Jose Villaveces    schedule 22.06.2012    source източник


Отговори (2)


Това трябва да ви помогне. Опитайте и ми кажете. http://www.strongd.net/?p=44

person logan    schedule 22.06.2012
comment
Както казах, опитах да избягам от заявката с помощта на анализатора на заявки (QueryParser.escape(altId)) без успех. Пробвах и алтернативата на шаблона, предложена в връзка, и виждам, че въвеждането от потребителя е екранирано alt_id:xla\:379474, но все още няма резултати при изпълнение на заявката. - person Jose Villaveces; 22.06.2012

Оказа се, че проблемът не е свързан с избягването, а с начина, по който alt_id е индексиран и използването на TermQuery. Има 2 възможни решения:

  1. Заменете TermQuery с резултата от QueryParser.parse, с QueryParser, създаден с StandardAnalyzer.
  2. Или индексирайте alt_id като Index.NOT_ANALYZED и останете с TermQuery.

Приложих последния и работи добре.

person Jose Villaveces    schedule 26.06.2012