こんにちは私は32MBのファイルを持っています。これは、280万行を含む1250でエンコードされた単純な辞書ファイルです。すべての行には、一意の単語が1つだけあります。
cat
dog
god
...
Luceneを使用して、特定の単語の辞書にあるすべてのアナグラムを検索したいと思います。例えば:
犬という単語のすべてのアナグラムを検索したいのですが、luceneは私の辞書を検索して、犬と神を返す必要があります。私のウェブアプリにはWordエンティティがあります:
public class Word {
private Long id;
private String word;
private String baseLetters;
private String definition;
}
baseLettersは、そのようなアナグラムを検索するためにアルファベット順に並べ替えられた変数です[神と犬の単語は同じbaseLetters:dgoを持ちます]。別のサービスでこのbaseLetters変数を使用して、データベースからこのようなアナグラムを検索することに成功しましたが、辞書ファイルのインデックスを作成するのに問題があります。フィールドに追加する必要があることはわかっています。
wordとbaseLettersですが、その方法がわかりません:(誰かがこの目標を達成するための方向性を教えてくれませんか?
今のところ私はそのようなものしか持っていません:
public class DictionaryIndexer {
private static final Logger logger = LoggerFactory.getLogger(DictionaryIndexer.class);
@Value("${dictionary.path}")
private String dictionaryPath;
@Value("${lucene.search.indexDir}")
private String indexPath;
public void createIndex() throws CorruptIndexException, LockObtainFailedException {
try {
IndexWriter indexWriter = getLuceneIndexer();
createDocument();
} catch (IOException e) {
logger.error(e.getMessage(), e);
}
}
private IndexWriter getLuceneIndexer() throws CorruptIndexException, LockObtainFailedException, IOException {
StandardAnalyzer analyzer = new StandardAnalyzer(Version.LUCENE_36);
IndexWriterConfig indexWriterConfig = new IndexWriterConfig(Version.LUCENE_36, analyzer);
indexWriterConfig.setOpenMode(OpenMode.CREATE_OR_APPEND);
Directory directory = new SimpleFSDirectory(new File(indexPath));
return new IndexWriter(directory, indexWriterConfig);
}
private void createDocument() throws FileNotFoundException {
File sjp = new File(dictionaryPath);
Reader reader = new FileReader(sjp);
Document dictionary = new Document();
dictionary.add(new Field("word", reader));
}
}
PS:もう1つ質問があります。SpringでDocumentIndexerをBeanとして登録すると、Webアプリを再デプロイするたびにインデックスが作成/追加されますか?同じことが将来のDictionarySearcherにも当てはまりますか?