как искать файл с lucene - PullRequest
       1

как искать файл с lucene

1 голос
/ 22 января 2012

Я хочу выполнить поиск запроса в файле "fdictionary.txt", содержащем список слов (230 000 слов), записанных построчно.Любое предложение, почему этот код не работает?Часть проверки орфографии работает и дает мне список предложений (я ограничил длину списка до 1).то, что я хочу сделать, - это поиск этого словаря, и если слово уже там, не вызывать проверку орфографииМоя функция поиска не работает.Это не дает мне ошибки!Вот что я реализовал:

public class SpellCorrection {

public static File indexDir = new File("/../idxDir");

public static void main(String[] args) throws IOException, FileNotFoundException, CorruptIndexException, ParseException {

    Directory directory = FSDirectory.open(indexDir);
    SpellChecker spell = new SpellChecker(directory);

    IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_20, null);
    File dictionary = new File("/../fdictionary00.txt");
    spell.indexDictionary(new PlainTextDictionary(dictionary), config, true);


    String query = "red"; //kne, console
    String correctedQuery = query; //kne, console

    if (!search(directory, query)) {
        String[] suggestions = spell.suggestSimilar(query, 1);
        if (suggestions != null) {correctedQuery=suggestions[0];}
    }

    System.out.println("The Query was: "+query);
    System.out.println("The Corrected Query is: "+correctedQuery);
}

public static boolean search(Directory directory, String queryTerm) throws FileNotFoundException, CorruptIndexException, IOException, ParseException {
    boolean isIn = false;

    IndexReader indexReader = IndexReader.open(directory);
    IndexSearcher indexSearcher = new IndexSearcher(indexReader);
    Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_20);

    Term term = new Term(queryTerm);
    Query termQuery = new TermQuery(term);
    TopDocs hits = indexSearcher.search(termQuery, 100);
    System.out.println(hits.totalHits);


    if (hits.totalHits > 0) {
        isIn = true;
    }
    return isIn;
}
}

Ответы [ 3 ]

1 голос
/ 22 января 2012

где вы индексируете контент из fdictionary00.txt?

Вы можете искать, используя IndexSearcher, только если у вас есть индекс. Если вы новичок в Lucene, вы можете проверить некоторые быстрые учебники. (как http://lucenetutorial.com/lucene-in-5-minutes.html)

0 голосов
/ 01 октября 2013

Вы можете сделать свой экземпляр SpellChecker доступным в службе и использовать spellChecker.exist(word).

Имейте в виду, что SpellChecker не будет индексировать слова 2 символа или меньше. Чтобы обойти это, вы можете добавить их в индекс после его создания (добавить их в поле SpellChecker.F_WORD).

Если вы хотите добавить в свой текущий индекс и сделать их доступными для exist(word), вам нужно будет добавить их в поле SpellChecker.F_WORD. Конечно, поскольку вы не добавляете все остальные поля, такие как грамм / начало / конец и т. Д., Ваше слово не будет отображаться в качестве подсказки для других слов с ошибками.

В этом случае вам пришлось бы добавить слово в ваш файл, чтобы при повторном создании индекса оно было доступно в качестве предложения. Было бы замечательно, если бы проект сделал SpellChecker.createDocument(...) общедоступным / защищенным, а не частным, так как этот метод выполняет все путем добавления слов.

После всего этого вам нужно позвонить spellChecker.setSpellIndex(directory).

0 голосов
/ 23 января 2012

Вы никогда не строили индекс.

Вам нужно настроить индекс ...

Directory directory = FSDirectory.open(indexDir);
Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_20);
IndexWriter writer = new IndexWriter(directory,analyzer,true,IndexWriter.MaxFieldLength.UNLIMITED );

Затем вам нужно создать документ и добавить каждый термин в документ как анализируемое поле.

 Document doc = new Document();
 doc.Add(new Field("name", word , Field.Store.YES, Field.Index.ANALYZED));

Затем добавьте документ в индекс

writer.AddDocument(doc);

writer.Optimize();

Теперь создайте индекс и закройте средство записи индекса.

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