【Lucene】挖掘相关搜索词
搜索引擎中往往有一个可选的搜索词的列表,当搜索结果太少时,可以帮助用户扩展搜索内容,或者搜索结果太多的时候可以帮助用户深入定向搜索。一种方法是从搜索日志中挖掘字面相似的词作为相关搜索词列表。另一种方法是把用户共同查询的词作为相关搜索词,需要有搜索日志才能实现。【摘自《Lucene In Action》】
下面使用的是第一种方法:
package com.tan.code; //省略引入 public class RelateWords { private static final String TEXT_FIELD = "text"; /** * * @param words 候選相関詞列表 * @param word 相關搜索詞的種子詞 * @return * @throws IOException * @throws ParseException */ static public String[] filterRelated(HashSet<String> words, String word) throws IOException, ParseException { //RAMDirectory ramDirectory = new RAMDirectory(); Directory directory=new SimpleFSDirectory(new File("E://related")); IndexWriter indexWriter = new IndexWriter(directory, new IndexWriterConfig(Version.LUCENE_43, new IKAnalyzer(true))); for (String text : words) { Document document = new Document(); document.add(new TextField(TEXT_FIELD, text, Store.YES)); indexWriter.addDocument(document); } indexWriter.close(); IndexReader indexReader = DirectoryReader.open(directory); IndexSearcher indexSearcher = new IndexSearcher(indexReader); QueryParser queryParser = new QueryParser(Version.LUCENE_43, TEXT_FIELD, new IKAnalyzer(true)); Query query = queryParser.parse(word); TopDocs td = indexSearcher.search(query, 10); ScoreDoc[] sd = td.scoreDocs; String relateWords[] = new String[sd.length]; for (int i = 0; i < sd.length; i++) { int z = sd[i].doc; Document doc = indexSearcher.doc(z); relateWords[i] = doc.get(TEXT_FIELD); } indexReader.close(); //ramDirectory.close(); directory.close(); return relateWords; } }
测试代码:
@Test public void test() throws IOException, ParseException { // fail("Not yet implemented"); HashSet<String> words = new HashSet<String>(); // words.add("Lucene"); // words.add("Lucene入門資料"); // words.add("java資料下載"); // words.add("SQL詳解"); // words.add("揭祕Lucene原理"); // words.add("Spring原理解析"); // words.add("什麽是Lucene?怎麽樣才可以學好Lucene呢?"); String word = "Spring資料"; String rewords[] = RelateWords.filterRelated(words, word); System.out.println("搜索内容:" + word); System.out.println("相關搜索匹配結果:"); for (int i = 0; i < rewords.length; i++) { System.out.println(rewords[i]); } }
测试结果:
搜索内容:Spring資料 相關搜索匹配結果: java資料下載 Lucene入門資料 Spring原理解析