正直苦戦した(;´∀`)
最新の4.2、4.3で動作確認済みだぜぇ(゚∀゚)
てか日本語サイト少なすぎだわ(´;ω;`)
なんで米googleを使って検索しないといけないんだよ٩(๑`^´๑)۶
もぉ少しで激おこスティックファイナリアリティぷんぷんドリームだったゎヾ(*`Д´*)ノ"
import java.io.File; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.ja.JapaneseAnalyzer; import org.apache.lucene.analysis.ja.JapaneseTokenizer.Mode; import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; import org.apache.lucene.document.FieldType; import org.apache.lucene.index.DirectoryReader; import org.apache.lucene.index.IndexWriter; import org.apache.lucene.index.IndexWriterConfig; import org.apache.lucene.index.Term; import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.ScoreDoc; import org.apache.lucene.search.TermQuery; import org.apache.lucene.store.Directory; import org.apache.lucene.store.FSDirectory; import org.apache.lucene.util.Version; /** * Luceneユーティリティ */ public final class LuceneUtil { /** */ private LuceneUtil() { } /** 全文検索用日本語アナライザー */ // Version.LUCENE_43 Luceneバージョン // null UserDictionary ユーザ辞書 // Mode.SEARCH モード(NORMAL、SEARCH、EXTENDED) ※デフォルトはNORMAL // DefaultStopSet ストップワード「の」「に」「は」「を」「と」など // DefaultStopTags ストップタグ[接続詞][助動詞][記号]など public static final Analyzer ANALYZER = new JapaneseAnalyzer( Version.LUCENE_43, null, Mode.SEARCH, JapaneseAnalyzer.getDefaultStopSet(), JapaneseAnalyzer.getDefaultStopTags()); /** Key */ // 主キー項目(あると便利w) public static final String INDEX_KEY = "key"; /** Code */ // コード public static final String INDEX_CODE = "code"; /** Value */ // 値 public static final String INDEX_VALUE = "value"; /** インデックスパス */ // インデックスの保存場所 今回は ドライブ/index/ に配置 public static final String INDEX_PATH = "/index/"; /** * インデックスの登録 * @param key キー * @param code コード * @param value 値 * @throws Exception システム例外 */ public static void regIndex(final Long key, final String code, final String value) throws Exception { /** * ドキュメントの取得 */ Document doc = new Document(); // key doc.add(new Field(INDEX_KEY, key.toString(), notAnalyzedFieldType())); // code doc.add(new Field(INDEX_CODE, code, notAnalyzedFieldType())); // value doc.add(new Field(INDEX_VALUE, value, analyzedFieldType())); /** * 保存処理 */ try (Directory directory = FSDirectory.open(new File(INDEX_PATH)); IndexWriter writer = new IndexWriter(directory, new IndexWriterConfig(Version.LUCENE_43, ANALYZER))) { // DocumentをIndexに保存 writer.addDocument(doc); writer.commit(); } } /** * インデックスの更新 * @param key キー * @param value 値 * @throws Exception システム例外 */ public static void updIndex(final Long key, final String value) throws Exception { /** * インデックスの検索 */ // key = 引数.key Term term = new Term(INDEX_KEY, key.toString()); // 検索 IndexSearcher searcher = new IndexSearcher(DirectoryReader.open(FSDirectory.open(new File(INDEX_PATH)))); // 1件検索 ScoreDoc[] hits = searcher.search(new TermQuery(term), null, 1).scoreDocs; /** * Luceneの設定 */ try (Directory directory = FSDirectory.open(new File(INDEX_PATH)); IndexWriter writer = new IndexWriter(directory, new IndexWriterConfig(Version.LUCENE_43, ANALYZER))) { /** * ドキュメントの取得 */ Document doc = searcher.doc(hits[0].doc); /** * valueの更新 */ // valueの削除 doc.removeField(INDEX_VALUE); // valueの再設定 doc.add(new Field(INDEX_VALUE, value, analyzedFieldType())); /** * 上書き */ writer.updateDocument(term, doc); writer.commit(); } } /** * インデックスの更新 * @param code コード * @param value 値 * @throws Exception システム例外 */ public static void updIndex(final String code, final String value) throws Exception { /** * インデックスの検索 */ // key = 引数.key Term term = new Term(INDEX_CODE, code); // 検索 IndexSearcher searcher = new IndexSearcher(DirectoryReader.open(FSDirectory.open(new File(INDEX_PATH)))); // 何件ヒットするかわからないので Integer.MAX_VALUE ScoreDoc[] hits = searcher.search(new TermQuery(term), null, Integer.MAX_VALUE).scoreDocs; /** * Luceneの設定 */ try (Directory directory = FSDirectory.open(new File(INDEX_PATH)); IndexWriter writer = new IndexWriter(directory, new IndexWriterConfig(Version.LUCENE_43, ANALYZER))) { for (ScoreDoc hit : hits) { /** * ドキュメントの取得 */ Document doc = searcher.doc(hit.doc); /** * valueの更新 */ // valueの削除 doc.removeField(INDEX_VALUE); // valueの再設定 doc.add(new Field(INDEX_VALUE, value, analyzedFieldType())); /** * 上書き */ writer.updateDocument(term, doc); } // コミット writer.commit(); } } /** * インデックスの削除 * @param key キー * @throws Exception システム例外 */ public static void delIndex(final Long key) throws Exception { /** * Luceneの設定 */ try (Directory directory = FSDirectory.open(new File(INDEX_PATH)); IndexWriter writer = new IndexWriter(directory, new IndexWriterConfig(Version.LUCENE_43, ANALYZER))) { // key = 引数.key Term term = new Term(INDEX_KEY, key.toString()); /** * インデックスの削除処理 */ writer.deleteDocuments(new TermQuery(term)); writer.commit(); } } /** * Index.ANALYZEDの設定 * @return FieldType */ private static final FieldType analyzedFieldType() { FieldType ft = new FieldType(); ft.setStored(true); ft.setIndexed(true); ft.setTokenized(true); ft.setStoreTermVectors(true); ft.setOmitNorms(true); ft.freeze(); return ft; } /** * Index.NOT_ANALYZEDの設定 * @return FieldType */ private static final FieldType notAnalyzedFieldType() { FieldType ft = new FieldType(); ft.setStored(true); ft.setIndexed(true); ft.setTokenized(false); ft.setStoreTermVectors(true); ft.setOmitNorms(true); ft.freeze(); return ft; } }
昔3.0を使ってたが、いくつか非推奨になってて焦ったぜ(´;ω;`)
0 件のコメント:
コメントを投稿