搜索引擎中往往有一个可选的搜索词的列表当搜索结果太少时可以帮助用户扩展搜索内容或者搜索结果太多的时候可以帮助用户深入定向搜索一种方法是从搜索日志中挖掘字面相似的词作为相关搜索词列表另一种方法是把用户共同查询的词作为相关搜索词需要有搜索日志才能实现 下面使用的是第一种方法 [java] package de; //省略引入 public class RelateWords { private static final String TEXT_FIELD = text; /** * * @param words 候选相関词列表 * @param word 相关搜索词的种子词 * @return * @throws IOException * @throws ParseException */ static public String[] filterRelated(HashSet 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(VersionLUCENE_ new IKAnalyzer(true))); for (String text : words) { Document document = new Document(); documentadd(new TextField(TEXT_FIELD text StoreYES)); indexWriteraddDocument(document); } indexWriterclose(); IndexReader indexReader = DirectoryReaderopen(directory); IndexSearcher indexSearcher = new IndexSearcher(indexReader); QueryParser queryParser = new QueryParser(VersionLUCENE_ TEXT_FIELD new IKAnalyzer(true)); Query query = queryParserparse(word); TopDocs td = indexSearchersearch(query ); ScoreDoc[] sd = tdscoreDocs; String relateWords[] = new String[sdlength]; for (int i = ; i < sdlength; i++) { int z = sd[i]doc; Document doc = indexSearcherdoc(z); relateWords[i] = docget(TEXT_FIELD); } indexReaderclose(); //ramDirectoryclose(); directoryclose(); return relateWords; } } 测试代码 [java] @Test public void test() throws IOException ParseException { // fail(Not yet implemented); HashSet words = new HashSet(); // wordsadd(Lucene); // wordsadd(Lucene入门资料); // wordsadd(java资料下载); // wordsadd(SQL详解); // wordsadd(揭祕Lucene原理); // wordsadd(Spring原理解析); // wordsadd(什麽是Lucene?怎麽样才可以学好Lucene呢?); String word = Spring资料; String rewords[] = RelateWordsfilterRelated(words word); Systemoutprintln(搜索内容 + word); Systemoutprintln(相关搜索匹配结果); for (int i = ; i < rewordslength; i++) { Systemoutprintln(rewords[i]); } } 测试结果 [java] 搜索内容Spring资料 相关搜索匹配结果 java资料下载 Lucene入门资料 Spring原理解析 |