Lucene QueryParser игнорирует поисковый термин "BE" - PullRequest
3 голосов
/ 23 июня 2011

Я пытаюсь найти пару полей, и все работает нормально, если я не использую термин «BE». В этом случае Lucene просто игнорирует поле. Если я делаю что-то вроде того, что показано ниже, я получаю правильные результаты, и объект «запрос» отображается как «+ flag: bf + type: cgo». Если я установлю флаг или термины типа «BE», эта часть поиска будет игнорироваться. Например, если я установлю для queryString значение «flag: \» BE \ »AND type: \« CGO \ »« объект запроса будет показан как: «+ type: cgo», и я получу гораздо больше обращений. То же самое происходит для «типа» - если я изменю «CGO» в последнем примере на «BE», он будет проигнорирован. Я не пробовал все возможные комбинации из двух символов (но я пробовал много), но все работает, как ожидалось, кроме этой. Я не использую стоп-термины.

Спасибо, Гена

String queryString = "flag:\"BF\" AND type:\"CGO\"";
QueryParser qp  = new QueryParser(Version.LUCENE_30, 
                  "type", new StandardAnalyzer(Version.LUCENE_30));

Query query = qp.parse(queryString);
IndexSearcher searcher = new IndexSearcher(reader.reopen());
TopDocs td = searcher.search(q, 5000);
logger.info("Found " + td.totalHits + " hits using " + query.toString() );

Ответы [ 2 ]

4 голосов
/ 24 июня 2011

По умолчанию StandardAnalyzer использует набор стоп-слов, чтобы исключить «шум» из проиндексированных терминов в тексте.Я думаю, что «BE» обычно считается стоп-словом в контексте StandardAnalyzer.

К счастью, у вас есть несколько вариантов выбора

Очевидным являетсяпередать пустой набор стоп-слов в конструктор используемого StandardAnalyzer.

Однако, глядя на имена ваших полей ("flag" и "type"), они не выглядят точно так, как будто онинамеревался содержать простой текст, но с большей вероятностью содержать закодированные слова.Имея это в виду, вы можете найти анализатор ключевых слов лучше подходит.

Удачи,

1 голос
/ 24 июня 2011

Вы действительно используете стоп-слова, хотя можете и не пытаться:

QueryParser qp  = new QueryParser(Version.LUCENE_30, 
              "type", new StandardAnalyzer(Version.LUCENE_30));

StandardAnalyzer по умолчанию использует стандартные английские стоп-слова, включая «be».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...