专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »PHP教程 » lucene:用PHP调用Lucene包来实现全文检索 »正文

lucene:用PHP调用Lucene包来实现全文检索

来源: 发布时间:星期一, 2009年1月12日 浏览:8次 评论:0
  由于工作需要需要使用PHP实现对网站WebSite内大量数量进行全文检索而且目前最流行全文检索搜索引擎库就是Lucene了它是Apache Jakarta个子项目并且提供了简单实用API用这些API就可以对任何基本文本数据(包括数据库)进行全文检索

  PHP本身就支持外部Java类所以先用Java写了个类这个类通过LuceneAPI实现了两个思路方法: 

* public String createIndex(String indexDir_path,String dataDir_path)
* public String searchword(String ss,String index_path)


  其中createIndex是创建索引思路方法传入了两个参数分别是indexDir_path(索引文件目录)dataDir_path(被索引文件目录)返回被索引文件列表个是searchword通过传入关键字参数(ss)对索引进行检索index_path就是索引文件目录返回所有检索到文件

  这里是源代码很简单大家可以参考下:TxtFileIndexer.java

package TestLucene;
  
import java.io.File;import java.io.FileReader;
import java.io.Reader;
import java.util.Date;
  
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.Hits;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.store.FSDirectory;
  
public TxtFileIndexer ...{
  
  public String test ...{
     "test is ok hohoho";
  }
  
  /**//**
   * @param args
   */
  public String createIndex(String indexDir_path,String dataDir_path) throws Exception ...{
    String result = "";
    File indexDir = File(indexDir_path);
    File dataDir = File(dataDir_path);
    Analyzer luceneAnalyzer = StandardAnalyzer;
    File dataFiles = dataDir.listFiles;
    IndexWriter indexWriter = IndexWriter(indexDir,luceneAnalyzer,true);
    long startTime = Date.getTime;
    for( i=0; i < dataFiles.length; i) ...{
      (dataFiles[i].isFile && dataFiles[i].getName.endsWith(".html")) ...{
        result "Indexing file" + dataFiles[i].getCanonicalPath+"<br />";
        Document document = Document;
        Reader txtReader = FileReader(dataFiles[i]);
        document.add(Field.Text("path",dataFiles[i].getCanonicalPath));
        document.add(Field.Text("contents",txtReader));
        indexWriter.addDocument(document);
      }
    }
  
    indexWriter.optimize;
    indexWriter.close;
    long endTime = Date.getTime;
  
    result "It takes"+(endTime-startTime)
        + " milliseconds to create index for the files in directory "
        + dataDir.getPath;
     result;
  }
  
  public String searchword(String ss,String index_path) throws Exception ...{
    String queryStr = ss;
    String result = "Result:<br />";
    //This is the directory that hosts the Lucene index
    File indexDir = File(index_path);
    FSDirectory directory = FSDirectory.getDirectory(indexDir,false);
    IndexSearcher searcher = IndexSearcher(directory);
    (!indexDir.exists)...{
      result = "The Lucene index is not exist";
       result;
    }
    Term term = Term("contents",queryStr.toLowerCase);
    TermQuery luceneQuery = TermQuery(term);
    Hits hits = searcher.search(luceneQuery);
    for( i = 0; i < hits.length; i)...{
      Document document = hits.doc(i);
      result "<br /><a href='getfile.php?w="+ss+"&f="+document.get("path")+"'>File: " + document.get("path")+"</a>n";
    }
     result;
  }
  
}


  而PHP这两个思路方法实现对Lucene从而达到全文检索

  PHP思路方法如下:

  先创建个我们写TxtFileIndexer类例子

$tf = Java('TestLucene.TxtFileIndexer');

  然后就按正常PHP类思路方法方式进行首先创建索引:

$data_path = "F:/test/php_lucene/htdocs/data/manual"; //定义被索引内容目录
$index_path = "F:/test/php_lucene/htdocs/data/search"; //定义生成索引文件存放目录
$s = $tf->createIndex($index_path,$data_path); //Java类思路方法
pr $s; //打印返回结果


  这次再试试检索:

$index_path = "F:/test/php_lucene/htdocs/data/search"; //定义生成索引文件存放目录
$s = $tf->searchword("here is keyword for search",$index_path);
pr $s;


  另外要注意Java类路径可以在PHP里设置

java_require("F:/test/php_lucene/htdocs/lib/"); //

  这是个例子类和Lucene都放到这个目录下这样就可以了是不是很简单

  PHP源代码:test.php

<?php
  
  error_reporting(0);
  
  java_require("F:/test/php_lucene/htdocs/lib/");
  
  $tf = Java('TestLucene.TxtFileIndexer');
  $s = $tf->test;
  pr "TestLucene.TxtFileIndexer->test<br />".$s;
  echo "<hr />";
  
  $data_path = "F:/test/php_lucene/htdocs/data/manual";
  $index_path = "F:/test/php_lucene/htdocs/data/search";
  ($_GET["action"] "create") ...{
    $s = $tf->createIndex($index_path,$data_path);
    pr $s;
  } ...{
    echo "<form method=get> <input type=text name=w /><input type=submit value=search /><br />";
    ($_GET["w"] != "") ...{
      $s = $tf->searchword($_GET["w"],$index_path);
      pr $s;
    }
  }
?>




  接下来我把环境配置说先需要有Java SDK是必须我使用是1.4.2版其它版本应该也没问题PHP5试过PHP4应该可以由于PHP5带Java扩展没调通并且以前用过Java效率很低很慢所以使用了 Php/Java Bridge 这个项目

  1. 下载JavaBridge URL:http://sourceforge.net/projects/php-java-bridge/ 目前版本是php-java-bridge_3.0.8_j2ee.zip 解包后把

  a.JavaBridgeWEB-INFcgijava-x86-windows.dll

  b.JavaBridgeWEB-INFlibJavaBridge.jar

  复制到 c:phpext 目录下并把java-x86-windows.dll 改名为 php_java.dll

  2.修改php.ini(例)



  3.重启Apache即可

  4.可以找些文件进行索引在test.php里可以修改索引文件和数据文件路径TxtFileIndexer.java37行限制了只索引html后缀文件有需要也可以修改

  根据目前情况(JavaBridge支持Linux和Freebsd)完全可以在linux或freebsd/apache2/php4/lucene/JavaBridge环境下运行



0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: