【Lucene 挖掘相关搜索词】

搜索引擎中往往有一个可选的搜索词的列表,当搜索结果太少时,可以帮助用户扩展搜索内容,或者搜索结果太多的时候可以帮助用户深入定向搜索。一种方法是从搜索日志中挖掘字面相似的词作为相关搜索词列表。另一种方法是把用户共同查询的词作为相关搜索词,需要有搜索日志才能实现。

  下面使用的是第一种方法:

  [java]

  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 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;

  }

  }

  测试代码:

  [java]

  @Test

  public void test() throws IOException, ParseException {

  // fail("Not yet implemented");

  HashSet words = new HashSet();

  // 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]);

  }

  }

  测试结果:

  [java]

  搜索内容:Spring資料

  相關搜索匹配結果:

  java資料下載

  Lucene入門資料

  Spring原理解析

posted on 2013-10-08 09:48  挖掘者者者  阅读(193)  评论(0编辑  收藏  举报