Lucene: словосочетания в качестве поисковых терминов

Я пытаюсь сделать доступный для поиска телефон / местный бизнес-справочник, используя Apache Lucene.

У меня есть поля для названия улицы, названия компании, номера телефона и т. Д. Проблема, с которой я сталкиваюсь, заключается в том, что когда я пытаюсь выполнить поиск по улице, где название улицы состоит из нескольких слов (например, «полумесяц»), результаты не возвращаются. Но если я попытаюсь выполнить поиск по одному слову, например, «полумесяц», я получу все результаты, которые мне нужны.

Я индексирую данные с помощью следующего:

String LocationOfDirectory = "C:\\dir\\index";

StandardAnalyzer analyzer = new StandardAnalyzer(Version.LUCENE_34);
Directory Index = new SimpleFSDirectory(LocationOfDirectory);

IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE.34, analyzer);
IndexWriter w = new IndexWriter(index, config);


Document doc = new Document();
doc.add(new Field("Street", "the crescent", Field.Store.YES, Field.Index.Analyzed);

w.add(doc);
w.close();

Мои поиски работают так:

int numberOfHits = 200;
String LocationOfDirectory = "C:\\dir\\index";
TopScoreDocCollector collector = TopScoreDocCollector.create(numberOfHits, true);
Directory directory = new SimpleFSDirectory(new File(LocationOfDirectory));
IndexSearcher searcher = new IndexSearcher(IndexReader.open(directory);

WildcardQuery q = new WildcardQuery(new Term("Street", "the crescent");

searcher.search(q, collector);
ScoreDoc[] hits = collector.topDocs().scoreDocs;

Я попытался поменять местами шаблонный запрос для запроса фразы, сначала со всей строкой, а затем разделить строку на пустое пространство и обернуть их в BooleanQuery следующим образом:

String term = "the crescent";
BooleanQuery b = new BooleanQuery();
PhraseQuery p = new PhraseQuery();
String[] tokens = term.split(" ");
for(int i = 0 ; i < tokens.length ; ++i)
{
    p.add(new Term("Street", tokens[i]));
}
b.add(p, BooleanClause.Occur.MUST);

Однако это не сработало. Я попытался использовать KeywordAnalyzer вместо StandardAnalyzer, но затем все другие типы поиска перестали работать. Я попытался заменить пробелы другими символами (+ и @) и преобразовать запросы в и из этой формы, но это все равно не работает. Я думаю, что это не работает, потому что + и @ являются специальными символами, которые не индексируются, но я не могу найти список где-нибудь, какие символы такие.

Я начинаю немного сходить с ума, кто-нибудь знает, что я делаю не так?

Спасибо Рик

Ответы на вопрос(4)

Ваш ответ на вопрос