精华内容
下载资源
问答
  • 全文分两部分:一:Lucene简介Lucene版本:3.0.2全文检索大体分两个部分:索引创建(Indexing)和搜索索引(Search)1.索引过程:1)有一系列被索引文件(此处所指即数据库数据)2)被索引文件经过语法分析和语言处理形成一...

    全文分两部分:

    一:Lucene简介

    Lucene版本:3.0.2

    全文检索大体分两个部分:索引创建(Indexing)和搜索索引(Search)

    1. 索引过程:

    1) 有一系列被索引文件(此处所指即数据库数据)

    2) 被索引文件经过语法分析和语言处理形成一系列词(Term)。

    3) 经过索引创建形成词典和反向索引表。

    4) 通过索引存储将索引写入硬盘。

    2. 搜索过程:

    a) 用户输入查询语句。

    b) 对查询语句经过语法分析和语言分析得到一系列词(Term)。

    c) 通过语法分析得到一个查询树。

    d) 通过索引存储将索引读入到内存。

    e) 利用查询树搜索索引,从而得到每个词(Term)的文档链表,对文档链表进行交,差,并得到结果文档。

    f) 将搜索到的结果文档对查询的相关性进行排序。

    g) 返回查询结果给用户。

    · 索引过程如下:

    创建一个IndexWriter用来写索引文件,它有几个参数,INDEX_DIR就是索引文件所存放的位置,Analyzer便是用来对文档进行词法分析和语言处理的。

    创建一个Document代表我们要索引的文档。

    将不同的Field加入到文档中。我们知道,一篇文档有多种信息,如题目,作者,修改时间,内容等。不同类型的信息用不同的Field来表示,在本例子中,一共有两类信息进行了索引,一个是文件路径,一个是文件内容。其中FileReader的SRC_FILE就表示要索引的源文件。

    IndexWriter调用函数addDocument将索引写到索引文件夹中。

    · 搜索过程如下:

    IndexReader将磁盘上的索引信息读入到内存,INDEX_DIR就是索引文件存放的位置。

    创建IndexSearcher准备进行搜索。

    创建Analyer用来对查询语句进行词法分析和语言处理。

    创建QueryParser用来对查询语句进行语法分析。

    QueryParser调用parser进行语法分析,形成查询语法树,放到Query中。

    IndexSearcher调用search对查询语法树Query进行搜索,得到结果TopScoreDocCollector。

    二:代码示例(本文重点部分)

    1) 首先是连接数据库的jdbc配置文件信息以及存放索引文件的路径配置信息

    Test.properties代码  58063579_1.pngjdbc.driverClassName = com.mysql.jdbc.Driver

    jdbc.url = jdbc:mysql://192.168.0.1/dbname?autoReconnect=true&characterEncoding=utf8

    jdbc.username = root

    jdbc.password = password

    jdbc.maxIdle = 2

    jdbc.maxActive = 4

    jdbc.maxWait = 5000

    jdbc.validationQuery = select 0

    res.index.indexPath = D\:\\apache-tomcat-6.0.18\\webapps\\test\\testHome\\search\\res\\index1

    res.index.mainDirectory = D\:\\apache-tomcat-6.0.18\\webapps\\test\\testHome\\search\\res

    2) 读取资源文件的工具类:

    Java代码  58063579_1.pngpackage com.test.common;

    import java.io.IOException;

    import java.io.InputStream;

    import java.util.HashMap;

    import java.util.Map;

    import java.util.Properties;

    /**

    * PropertiesUtil.java

    * @version 1.0

    * @createTime 读取配置文件信息类

    */

    public class PropertiesUtil {

    private static String defaultPropertyFilePath = "/test.properties";

    private static Map ppsMap = new HashMap();

    /**

    * 读取默认文件的配置信息,读key返回value

    * @param key

    * @return value

    */

    public static final String getPropertyValue(String key) {

    Properties pps = getPropertyFile(defaultPropertyFilePath);

    return pps == null  null : pps.getProperty(key);

    }

    /**

    * 传入filePath读取指定property文件,读key返回value

    * @param propertyFilePath

    * @param key

    * @return value

    */

    public static String getPropertyValue(String propertyFilePath,String key) {

    if(propertyFilePath == null) {

    propertyFilePath = defaultPropertyFilePath;

    }

    Properties pps = getPropertyFile(propertyFilePath);

    return pps == null  null : pps.getProperty(key);

    }

    /**

    * 根据path返回property文件,并保存到HashMap中,提高效率

    * @param propertyFilePath

    * @return

    */

    public static Properties getPropertyFile(String propertyFilePath) {

    if(propertyFilePath == null) {

    return null;

    }

    Properties pps = ppsMap.get(propertyFilePath);

    if(pps == null) {

    InputStream in = PropertiesUtil.class.getResourceAsStream(propertyFilePath);

    pps = new Properties();

    try {

    pps.load(in);

    } catch (IOException e) {

    e.printStackTrace();

    }

    ppsMap.put(propertyFilePath, pps);

    }

    return pps;

    }

    }

    3) Jdbc连接数据库获取Connection工具类,不做分析,直接上代码

    Java代码  58063579_1.pngpackage com.test.common;

    import java.sql.Connection;

    import java.sql.DriverManager;

    import java.sql.ResultSet;

    import java.sql.SQLException;

    import java.sql.Statement;

    /**

    * JdbcUtil.java

    * @version 1.0

    * @createTime JDBC获取Connection工具类

    */

    public class JdbcUtil {

    private static Connection conn = null;

    private static final String URL;

    private static final String JDBC_DRIVER;

    private static final String USER_NAME;

    private static final String PASSWORD;

    static {

    URL = PropertiesUtil.getPropertyValue("jdbc.url");

    JDBC_DRIVER = PropertiesUtil.getPropertyValue("jdbc.driverClassName");

    USER_NAME = PropertiesUtil.getPropertyValue("jdbc.username");

    PASSWORD = PropertiesUtil.getPropertyValue("jdbc.password");

    }

    public static Connection getConnection() {

    try {

    Class.forName(JDBC_DRIVER);

    conn = DriverManager.getConnection(URL, USER_NAME, PASSWORD);

    } catch (ClassNotFoundException e) {

    e.printStackTrace();

    } catch (SQLException e) {

    e.printStackTrace();

    }

    return conn;

    }

    }

    4) 万事具备,只欠东风了,下面是核心部分,方法都有注释,不多说了,一步步来,我想肯定是没有问题的。代码如下:

    Java代码  58063579_1.pngpackage com.test.lucene.logic;

    import java.io.File;

    import java.sql.Connection;

    import java.sql.ResultSet;

    import java.sql.Statement;

    import java.util.ArrayList;

    import java.util.List;

    import org.apache.lucene.analysis.Analyzer;

    import org.apache.lucene.document.Document;

    import org.apache.lucene.document.Field;

    import org.apache.lucene.document.Field.TermVector;

    import org.apache.lucene.index.IndexWriter;

    import org.apache.lucene.queryParser.QueryParser;

    import org.apache.lucene.search.IndexSearcher;

    import org.apache.lucene.search.Query;

    import org.apache.lucene.search.ScoreDoc;

    import org.apache.lucene.search.Searcher;

    import org.apache.lucene.search.TopDocs;

    import org.apache.lucene.store.Directory;

    import org.apache.lucene.store.FSDirectory;

    import org.apache.lucene.util.Version;

    import org.wltea.analyzer.lucene.IKAnalyzer;

    import org.wltea.analyzer.lucene.IKSimilarity;

    import com.test.common.JdbcUtil;

    import com.test.common.PropertiesUtil;

    import com.test.lucene.model.SearchBean;

    /**

    * SearchLogic.java

    * @version 1.0

    * @createTime Lucene数据库检索

    */

    public class SearchLogic {

    private static Connection conn = null;

    private static Statement stmt = null;

    private static  ResultSet rs = null;

    private String searchDir = PropertiesUtil.getPropertyValue("res.index.indexPath");

    private static File indexFile = null;

    private static Searcher searcher = null;

    private static Analyzer analyzer = null;

    /** 索引页面缓冲 */

    private int maxBufferedDocs = 500;

    /**

    * 获取数据库数据

    * @return ResultSet

    * @throws Exception

    */

    public List getResult(String queryStr) throws Exception {

    List result = null;

    conn = JdbcUtil.getConnection();

    if(conn == null) {

    throw new Exception("数据库连接失败!");

    }

    String sql = "select articleid,title_en,title_cn,abstract_en,abstract_cn from p2p_jour_article";

    try {

    stmt = conn.createStatement();

    rs = stmt.executeQuery(sql);

    this.createIndex(rs);   //给数据库创建索引,此处执行一次,不要每次运行都创建索引,以后数据有更新可以后台调用更新索引

    TopDocs topDocs = this.search(queryStr);

    ScoreDoc[] scoreDocs = topDocs.scoreDocs;

    result = this.addHits2List(scoreDocs);

    } catch(Exception e) {

    e.printStackTrace();

    throw new Exception("数据库查询sql出错! sql : " + sql);

    } finally {

    if(rs != null) rs.close();

    if(stmt != null) stmt.close();

    if(conn != null) conn.close();

    }

    return result;

    }

    /**

    * 为数据库检索数据创建索引

    * @param rs

    * @throws Exception

    */

    private void createIndex(ResultSet rs) throws Exception {

    Directory directory = null;

    IndexWriter indexWriter = null;

    try {

    indexFile = new File(searchDir);

    if(!indexFile.exists()) {

    indexFile.mkdir();

    }

    directory = FSDirectory.open(indexFile);

    analyzer = new IKAnalyzer();

    indexWriter = new IndexWriter(directory, analyzer, true, IndexWriter.MaxFieldLength.UNLIMITED);

    indexWriter.setMaxBufferedDocs(maxBufferedDocs);

    Document doc = null;

    while(rs.next()) {

    doc = new Document();

    Field articleid = new Field("articleid", String.valueOf(rs

    .getInt("articleid")), Field.Store.YES,

    Field.Index.NOT_ANALYZED, TermVector.NO);

    Field abstract_cn = new Field("abstract_cn", rs

    .getString("abstract_cn") == null  "" : rs

    .getString("abstract_cn"), Field.Store.YES,

    Field.Index.ANALYZED, TermVector.NO);

    doc.add(articleid);

    doc.add(abstract_cn);

    indexWriter.addDocument(doc);

    }

    indexWriter.optimize();

    indexWriter.close();

    } catch(Exception e) {

    e.printStackTrace();

    }

    }

    /**

    * 搜索索引

    * @param queryStr

    * @return

    * @throws Exception

    */

    private TopDocs search(String queryStr) throws Exception {

    if(searcher == null) {

    indexFile = new File(searchDir);

    searcher = new IndexSearcher(FSDirectory.open(indexFile));

    }

    searcher.setSimilarity(new IKSimilarity());

    QueryParser parser = new QueryParser(Version.LUCENE_30,"abstract_cn",new IKAnalyzer());

    Query query = parser.parse(queryStr);

    TopDocs topDocs = searcher.search(query, searcher.maxDoc());

    return topDocs;

    }

    /**

    * 返回结果并添加到List中

    * @param scoreDocs

    * @return

    * @throws Exception

    */

    private List addHits2List(ScoreDoc[] scoreDocs ) throws Exception {

    List listBean = new ArrayList();

    SearchBean bean = null;

    for(int i=0 ; i

    int docId = scoreDocs[i].doc;

    Document doc = searcher.doc(docId);

    bean = new SearchBean();

    bean.setArticleid(doc.get("articleid"));

    bean.setAbstract_cn(doc.get("abstract_cn"));

    listBean.add(bean);

    }

    return listBean;

    }

    public static void main(String[] args) {

    SearchLogic logic = new SearchLogic();

    try {

    Long startTime = System.currentTimeMillis();

    List result = logic.getResult("急性   肺   潮气量   临床试验");

    int i = 0;

    for(SearchBean bean : result) {

    if(i == 10) break;

    System.out.println("bean.name " + bean.getClass().getName()

    + " : bean.articleid " + bean.getArticleid()

    + " : bean.abstract_cn " + bean.getAbstract_cn());

    i++;

    }

    System.out.println("searchBean.result.size : " + result.size());

    Long endTime = System.currentTimeMillis();

    System.out.println("查询所花费的时间为:" + (endTime-startTime)/1000);

    } catch (Exception e) {

    e.printStackTrace();

    System.out.println(e.getMessage());

    }

    }

    }

    5) 第四步用到了一个SearchBean,其实这就是一个javabean文件,包含两个String类型(articleid和abstract_cn)的set、get方法,自己回去补上吧。

    顺便说下数据库表结构:

    tablename随便取,但要跟上面查询中的表对应

    表字段:articleid  int 类型

    abstract_cn   varchar类型

    对表字段没有太严格的定义,本来就是用来测试的。

    6) 最后给大家提供所使用到的jar包列表:

    IKAnalyzer3.2.5Stable.jar(一位好心人建议我升级一下jar包,呵呵,最新的jar包名为:IKAnalyzer3.2.8.jar ,谢谢了!)

    lucene-analyzers-3.0.2

    lucene-core-3.0.2

    lucene-highlighter-3.0.2

    lucene-memory-3.0.2

    lucene-queries-3.0.2

    mysql-connector-java-5.0.8-bin

    好了,有兴趣的人可以试试吧,代码都经过我测试过了,虽然有些地方代码结构不是特别完整,但只是入门用而已。先有了一个成功能够运行的例子之后才有更多的心情去接着学下去,~_~

    展开全文
  • 设置过程 1.首先,检查你的数据库是否安装了intermedia 这可以通过检查是否有ctxsys用户和ctxapp角色(role). 如果没有这个用户和角色,意味着你的数据库创建时未安装intermedia功能。 你必须修改数据库...

    设置过程


    1.首先,检查你的数据库是否安装了intermedia


    这可以通过检查是否有ctxsys用户和ctxapp角色(role).

    如果没有这个用户和角色,意味着你的数据库创建时未安装intermedia功能。

    你必须修改数据库以安装这项功能。
     修改过程:
          运行 $ORACLE_HOME/bin/dbassist, 选择'modify database', 然后在选择数据库功能时将j server 和 intermedia 都选上(安装intermedia必须同时安装jserver).强烈建议你在做这个改动前先备份整个数据库。

    2.设置extproc


     Oracle 是通过所谓的‘外部调用功能’(external procedure)来实现intermedia的,因此正确地设置extproc是关键一步。
     首先要配置listener 使它能监听intermedia 调用的请求。你可以通过运行$ORACLE_HOME/bin/netassit 来进行配置,也可以手工修改配置文件:$ORACLE_HOME/network/admin/listener.ora ,然后重新启动listener。下面以一个例子来讲述如何手工修改配置文件。
     打开listener.ora文件,在修改前,通常有如下内容(假定使用缺省listener):

    LISTENER = 
     (DESCRIPTION = 
     (ADDRESS = (PROTOCOL = TCP)(HOST = MYDATABASE)(PORT = 1521)) 
     ) 
    
     SID_LIST_LISTENER = 
     (SID_DESC = 
     (GLOBAL_DBNAME = mydatabase.world) 
     (ORACLE_HOME = /u01/app/oracle/product/8.1.6) 
     (SID_NAME = mydatabase) 
     ) 
    


    这个listener还没有配置extproc, 因此,需要为它增加对extproc的监听,办法就是分别增加description 和 sid_desc. 修改后的listner.ora 如下:

    LISTENER = 
     (DESCRIPTION_LIST = 
     (DESCRIPTION = 
     (ADDRESS = (PROTOCOL = TCP)(HOST = MYDATABASE)(PORT = 1521)) 
     ) 
     (DESCRIPTION = 
     (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC)) 
    
     ) 
     ) 
     SID_LIST_LISTENER = 
     (SID_LIST = 
     (SID_DESC = 
     (GLOBAL_DBNAME = mydatabase.world) 
     (ORACLE_HOME = /u01/app/oracle/product/8.1.6) 
     (SID_NAME = mydatabase) 
     ) 
     (SID_DESC = 
     (PROGRAM = extproc) 
     (SID_NAME = PLSExtProc) 
     (ORACLE_HOME = /u01/app/oracle/product/8.1.6) 
     ) 
     ) 
    

    注意上面的host, global_dbname,sid_name,oracle_home应填写你的数据库的实际值,但program一项必须填写extproc.
    其次,要配置服务器端的tnsnames.ora文件。该文件的位置在$ORACLE_HOME/network/admin下面。同样可以通过运行netasst来进行配置。
     在tnsnames.ora文件中需要增加如下一项:
    EXTPROC_CONNECTION_DATA,EXTPROC_CONNECTION_DATA.WORLD =
     (DESCRIPTION =
     (ADDRESS_LIST =
     (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))
     )
     (CONNECT_DATA =
     (SID = PLSExtProc)
     )
     )
    注意其中,KEY 和SID必须与listener.ora中的key 和sid_name对应相同。
     修改完成后,重新启动listener (先用lsnrctl stop, 然后 lsnrctl start), 然后,使用tnsping 来测试一下是否配置正确:
    tnsping extproc_connection_data 或者
    tnsping extproc_connection_data.world,如果配置正确,会显示:
    Attempting to contact (ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC)) OK(140毫秒)
     否则请检查你的上述两个文件,并注意,在修改后一定要重新启动listener,但并不需要重新启动数据库。

    3.设置词法分析器(lexer)


     Oracle实现全文检索,其机制其实很简单。

    即通过Oracle专利的词法分析器(lexer),将文章中所有的表意单元(Oracle 称为 term) 找出来,记录在一组 以 dr$开头的表中,

    同时记下该term出现的位置、次数、hash 值等信息。检索时,Oracle 从这组表中查找相应的 term,并计算其出现频率,根据某个算法来计算每个文档的得分(score),

    即所谓的‘匹配率’。而lexer则是该机制的核心,它决定了全文检索的效率。Oracle 针对不同的语言提供了不同的 lexer, 而我们通常能用到其中的三个: 

    basic_lexer: 针对英语。它能根据空格和标点来将英语单词从句子中分离,还能自动将一些出现频率过高已经失去检索意义的单词作为‘垃圾’处理,如if , is 等,

    具有较高的处理效率。但该lexer应用于汉语则有很多问题,由于它只认空格和标点,而汉语的一句话中通常不会有空格.

    因此,它会把整句话作为一个term,事实上失去检索能力。

    以‘中国人民站起来了’这句话为例,basic_lexer 分析的结果只有一个term ,就是‘中国人民站起来了’。此时若检索‘中国’,将检索不到内容。

    chinese_vgram_lexer: 专门的汉语分析器,支持所有汉字字符集。

    该分析器按字为单元来分析汉语句子。‘中国人民站起来了’这句话,会被它分析成如下几个term: ‘中’,‘中国’,‘国人’,‘人民’,‘民站’,‘站起’,起来’,‘来了’,‘了’。

    可以看出,这种分析方法,实现算法很简单,并且能实现‘一网打尽’,但效率则是差强人意。

    chinese_lexer: 这是一个新的汉语分析器,只支持utf8字符集。

    上面已经看到,chinese vgram lexer这个分析器由于不认识常用的汉语词汇,因此分析的单元非常机械,像上面的‘民站’,‘站起’在汉语中根本不会单独出现,

    因此这种term是没有意义的,反而影响效率。chinese_lexer的最大改进就是该分析器 能认识大部分常用汉语词汇,因此能更有效率地分析句子,

    像以上两个愚蠢的单元将不会再出现,极大 提高了效率。但是它只支持 utf8, 如果你的数据库是zhs16gbk字符集,则只能使用笨笨的那个Chinese vgram lexer.

    如果不做任何设置,Oracle 缺省使用basic_lexer这个分析器。要指定使用哪一个lexer, 可以这样操作:

    第一.在ctxsys用户下建立一个preference:


     begin ctx_ddl.create_preference('my_lexer','chinese_vgram_lexer'); end;

    第二.在建立intermedia索引时,指明所用的lexer:


     create index myindex on mytable(mycolumn) indextype is ctxsys.context
     parameters('lexer my_lexer');

    这样建立的全文检索索引,就会使用chinese_vgram_lexer作为分析器。

    4.使用job定时同步和优化


     在intermedia索引建好后,如果表中的数据发生变化,比如增加或修改了记录,怎么办?

    由于对表所发生的任何dml语句,都不会自动修改索引,因此,必须定时同步(sync)和优化(optimize)索引,以正确反映数据的变化。

    在索引建好后,我们可以在该用户下查到Oracle自动产生了以下几个表:(假设索引名为myindex):

    DR$myindex$I,DR$myindex$K,DR$myindex$R,DR$myindex$N

    其中以I表最重要,可以查询一下该表,看看有什么内容:

    select token_text, token_count from DR$I_RSK1$I where rownum<=20;

    这里就不列出查询接过了。可以看到,该表中保存的其实就是Oracle 分析你的文档后,生成的term记录在这里,包括term出现的位置、次数、hash值等。

    当文档的内容改变后,可以想见这个I表的内容也应该相应改变,才能保证Oracle在做全文检索时正确检索到内容(因为所谓全文检索,其实核心就是查询这个表)。

    那么如何维护该表的内容呢?

    总不能每次数据改变都重新建立索引吧!这就用到sync 和 optimize了。

    同步(sync):将新的term 保存到I表;

    优化(optimize):清除I表的垃圾,主要是将已经被删除的term从I表删除。

    Oracle提供了一个所谓的ctx server来做这个同步和优化的工作,只需要在后台运行这个进程,它会监视数据的变化,及时进行同步。

    但笔者使用ctxserver碰到了许多问题,Oracle 北京的support也建议不使用,而是用以下的两个job来完成(该job要建在和表同一个用户下):

    -- sync:
     VARIABLE jobno number;
     BEGIN
     DBMS_JOB.SUBMIT(:jobno,'ctx_ddl.sync_index(''myindex'');',
     SYSDATE, 'SYSDATE + (1/24/4)');
     commit;
     END;

     -- optimizer
     VARIABLE jobno number;
     BEGIN
     DBMS_JOB.SUBMIT(:jobno,'ctx_ddl.optimize_index(''myindex'',''FULL'');',
     SYSDATE, 'SYSDATE + 1');
     commit;
     END;
    其中, 第一个job的SYSDATE + (1/24/4)是指每隔15分钟同步一次,第二个job的SYSDATE + 1是每隔1天做一次全优化。具体的时间间隔,你可以根据自己的应用的需要而定。至此,你的全文检索功能已设置完成。

     

     常见错误


     下面就一些常见的错误信息给出解释和解决办法:


    1, sync 失败


    DRG-10595: ALTER INDEX T_DOC6_CT失败
    DRG-50857: oracle error in drsxsopen
     ORA-01480: STR 赋值变量缺少空后缀

     解决:这是8i的一个bug, 但可以避免它,方法是在同步之前先发一个语句:
    alter session set nls_language=American;

     2.create index 失败


    ORA-29855: 执行 ODCIINDEXCREATE 例行程序时出错
    ORA-20000: interMedia Text 错误:
    ORA-06512: 在"CTXSYS.DRUE", line 126
     ORA-06512: 在"CTXSYS.TEXTINDEXMETHODS", line 54
     ORA-06512: 在line 1

    解决:这是8.1.6.3之前的版本的一个bug, 在处理中文时,某个特殊字符造成的。向Oracle要补丁,或者自己去metalink.oracle.com 下载(需要CSI 号码)。

    3.create index 失败


    RA-29855: 执行 ODCIINDEXCREATE 例行程序时出错
    ORA-20000: interMedia Text 错误:
    DRG-50704: Net8 监听器没有运行或无法启动外部过程
    ORA-28575: 无法打开与外部过程代理程序的 RPC 连接
    ORA-06512: 在"CTXSYS.DRUE", line 126
     ORA-06512: 在"CTXSYS.TEXTINDEXMETHODS", line 54
     ORA-06512: 在line 1

    解决:明显的extproc配置不当。仔细阅读本文基本设置的第二步。

    4.访问建有索引的表时失败


    ora-29861: 域索引标记为loading/failed/unusable

    解决:这是该表的一个intermedia索引有问题,该索引要么没有正确建立,要么是某次同步失败导致它状态异常。先查到是哪个索引:
    Select idx_name,idx_status from ctxsys.ctx_indexes;
    然后同步该索引或者强制删除它:
     重建:alter index myindex rebuild online parameters('sync');
    删除:drop index myindex force;

     5.使用chinese_lexer失败


    ERROR at row 1:
     ORA-29855: err on ODCIINDEXCREATE
     ORA-20000: interMedia Text err:
     DRG-10502: index 1386 is not existing.
     DRG-11102: the lexer cann't analyze as SIMPLIFIED CHINESE_CHINA.ZHS16GBK
     ORA-06512: 在"CTXSYS.DRUE", line 126
     ORA-06512: 在"CTXSYS.TEXTINDEXMETHODS", line 54
     ORA-06512: 在line 1
    解决:chinese_lexer 只支持utf8字符集。现在你面临抉择:忍受chinese vgram lexer的愚蠢,或者将数据库字符集改到 utf8, 但面对可能引起你的应用不能正确处理中文的风险(先咨询Oracle support, 并且与你的应用软件提供商联系)。

    6.升级或应用patch后失败


    ORA-29856: err when execute ODCIINDEXDROP
     ORA-20000: interMedia Texterr
     ORA-06508: PL/SQL: can not find program unit beingcalled
     ORA-06512: at "CTXSYS.DRUE", line 126
     ORA-06512: at"CTXSYS.TEXTINDEXMETHODS", line 229
     ORA-06512: at line 1

    解决:这是intermedia的某个object 没有正确产生或者编译。用ctxsys用户登录后,运行 $oracle_home/ctx/admin/dr0pkh.sql 和 $oracle_home/ctx/admin/dr0plb.sql 以重新产生所有的package.你也可以直接察看dba_objects视图,找出那些属于ctxsys用户并且status 为invalid的东西,重新产生或者重新编译。(你可能会发现有许多这种东西,不要惊讶,Oracle不会因此而崩溃)。

    7.create index 失败


    ERROR 位于第 1 行:
    ORA-29855: 执行 ODCIINDEXCREATE 例行程序时出错
    ORA-20000: interMedia Text 错误:
    DRG-50857: oracle error in driddl.IndexResume
     ORA-04030: 在尝试分配 524288 字节 (cursor work he,QERHJ Bit vector)时进程内存不足
    ORA-06512: 在"CTXSYS.DRUE", line 126
     ORA-06512: 在"CTXSYS.TEXTINDEXMETHODS", line 214
     ORA-06512: 在line 1

    解决:引起这个问题可以有多种原因,首先你可以将sort_area_size这个参数减小到不多于2M,这可以防止Oracle在创建索引时分配太多的sort 内存而耗尽资源。 但如果这不起作用,而且你是8.1.7, 则恭喜,你hit 了bug 1391737. 该bug 在你要建索引的字段,如果某条记录的长度超过2000字符时引起Oracle耗尽内存资源。别无它法,除了打 8.1.7.1B 的补丁

    展开全文
  • 1: 系统已经安装了postgresql 数据 (不管有没有安装全,总之已经可以创建数据库,创建表,查询....了)2:查看已安装的数据库版本postgres=# select version();version-------------------------------------------------...

    1: 系统已经安装了postgresql 数据 (不管有没有安装全,总之已经可以创建数据库,创建表,查询....了)

    2:查看已安装的数据库版本

    postgres=# select version();

    version

    ----------------------------------------------------------------------------------------------------------

    PostgreSQL 10.10 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-36), 64-bit

    (1 row)

    3: 需要安装(如果已经安装了就不用安装了,看好一共是3个 联系我QQ 820688215 可以互相学些PG)

    yum -y install postgresql10-server postgresql10-contrib postgresql10-devel

    4: 看一下自己的数据安装路径,然后配置环境变量

    export PATH=/usr/pgsql-10/bin:$PATH

    5:下载

    安装SCWS

    因为zhparser是基于SCWS(简易中文分词系统)开发的。所以必须首先安装SCWS。

    ·

    自行创建安装目录

    [root@jxstar-dev home]# wget http://www.xunsearch.com/scws/down/scws-1.2.2.tar.bz2

    --2020-12-22 18:13:20-- http://www.xunsearch.com/scws/down/scws-1.2.2.tar.bz2

    正在解析主机 www.xunsearch.com (www.xunsearch.com)... 202.75.214.12

    正在连接 www.xunsearch.com (www.xunsearch.com)|202.75.214.12|:80... 已连接。

    已发出 HTTP 请求,正在等待回应... 200 OK

    长度:435267 (425K) [text/plain]

    正在保存至: “scws-1.2.2.tar.bz2”

    100%[=======================================================================================================================================================>] 435,267 --.-K/s 用时 0.1s

    2020-12-22 18:13:21 (2.80 MB/s) - 已保存 “scws-1.2.2.tar.bz2” [435267/435267])

    [root@jxstar-dev home]# tar xvf scws-1.2.2.tar.bz2

    scws-1.2.2/

    scws-1.2.2/aclocal.m4

    scws-1.2.2/API.md

    scws-1.2.2/AUTHORS

    scws-1.2.2/ChangeLog

    scws-1.2.2/cli/

    scws-1.2.2/config.guess

    scws-1.2.2/config.h.in

    scws-1.2.2/config.sub

    scws-1.2.2/configure

    scws-1.2.2/configure.ac

    scws-1.2.2/COPYING

    scws-1.2.2/depcomp

    scws-1.2.2/etc/

    scws-1.2.2/INSTALL

    scws-1.2.2/install-sh

    scws-1.2.2/libscws/

    scws-1.2.2/ltmain.sh

    scws-1.2.2/Makefile.am

    scws-1.2.2/Makefile.in

    scws-1.2.2/missing

    scws-1.2.2/NEWS

    scws-1.2.2/phpext/

    scws-1.2.2/README

    scws-1.2.2/win32/

    scws-1.2.2/win32/libscws.dsp

    scws-1.2.2/win32/libscws.vcproj

    scws-1.2.2/win32/readme.txt

    scws-1.2.2/win32/scws.dsp

    scws-1.2.2/win32/scws.dsw

    scws-1.2.2/win32/scws.sln

    scws-1.2.2/win32/scws.vcproj

    scws-1.2.2/phpext/config.m4

    scws-1.2.2/phpext/CREDITS

    scws-1.2.2/phpext/php_scws.c

    scws-1.2.2/phpext/php_scws.h

    scws-1.2.2/phpext/README.md

    scws-1.2.2/phpext/scws.php

    scws-1.2.2/phpext/scws_test.php

    scws-1.2.2/phpext/win32/

    scws-1.2.2/phpext/win32/php_scws-1.2.2-win32.zip

    scws-1.2.2/phpext/win32/README.txt

    scws-1.2.2/libscws/charset.c

    scws-1.2.2/libscws/charset.h

    scws-1.2.2/libscws/config_win32.h

    scws-1.2.2/libscws/crc32.c

    scws-1.2.2/libscws/crc32.h

    scws-1.2.2/libscws/darray.c

    scws-1.2.2/libscws/darray.h

    scws-1.2.2/libscws/lock.c

    scws-1.2.2/libscws/lock.h

    scws-1.2.2/libscws/Makefile.am

    scws-1.2.2/libscws/Makefile.in

    scws-1.2.2/libscws/pool.c

    scws-1.2.2/libscws/pool.h

    scws-1.2.2/libscws/rule.c

    scws-1.2.2/libscws/rule.h

    scws-1.2.2/libscws/scws.c

    scws-1.2.2/libscws/scws.h

    scws-1.2.2/libscws/version.h

    scws-1.2.2/libscws/version.h.in

    scws-1.2.2/libscws/xdb.c

    scws-1.2.2/libscws/xdb.h

    scws-1.2.2/libscws/xdict.c

    scws-1.2.2/libscws/xdict.h

    scws-1.2.2/libscws/xtree.c

    scws-1.2.2/libscws/xtree.h

    scws-1.2.2/etc/Makefile.am

    scws-1.2.2/etc/Makefile.in

    scws-1.2.2/etc/rules.ini

    scws-1.2.2/etc/rules.utf8.ini

    scws-1.2.2/etc/rules_cht.utf8.ini

    scws-1.2.2/cli/gen_dict.c

    scws-1.2.2/cli/Makefile.am

    scws-1.2.2/cli/Makefile.in

    scws-1.2.2/cli/scws_cmd.c

    //1>报错了!!!!!

    [root@jxstar-dev scws-1.2.2]# ./configure

    checking for a BSD-compatible install... /usr/bin/install -c

    checking whether build environment is sane... yes

    checking for a thread-safe mkdir -p... /usr/bin/mkdir -p

    checking for gawk... gawk

    checking whether make sets $(MAKE)... yes

    checking for gcc... no   

    checking for cc... no     这三个没有安装  需要yum install gcc cc cl.exe

    checking for cl.exe... no

    configure: error: in `/home/scws-1.2.2':

    configure: error: no acceptable C compiler found in $PATH

    See `config.log' for more details

    再次执行正确

    [root@jxstar-dev scws-1.2.2]# ./configure

    checking for a BSD-compatible install... /usr/bin/install -c

    checking whether build environment is sane... yes

    checking for a thread-safe mkdir -p... /usr/bin/mkdir -p

    checking for gawk... gawk

    checking whether make sets $(MAKE)... yes

    checking for gcc... gcc

    checking whether the C compiler works... yes

    checking for C compiler default output file name... a.out

    checking for suffix of executables...

    checking whether we are cross compiling... no

    checking for suffix of object files... o

    checking whether we are using the GNU C compiler... yes

    checking whether gcc accepts -g... yes

    checking for gcc option to accept ISO C89... none needed

    checking for style of include used by make... GNU

    checking dependency style of gcc... gcc3

    checking for a sed that does not truncate output... /usr/bin/sed

    checking whether ln -s works... yes

    checking whether make sets $(MAKE)... (cached) yes

    checking build system type... x86_64-unknown-linux-gnu

    checking host system type... x86_64-unknown-linux-gnu

    checking for a sed that does not truncate output... (cached) /usr/bin/sed

    checking for grep that handles long lines and -e... /usr/bin/grep

    checking for egrep... /usr/bin/grep -E

    checking for fgrep... /usr/bin/grep -F

    checking for ld used by gcc... /usr/bin/ld

    checking if the linker (/usr/bin/ld) is GNU ld... yes

    checking for BSD- or MS-compatible name lister (nm)... /usr/bin/nm -B

    checking the name lister (/usr/bin/nm -B) interface... BSD nm

    checking the maximum length of command line arguments... 1572864

    checking whether the shell understands some XSI constructs... yes

    checking whether the shell understands "+="... yes

    checking for /usr/bin/ld option to reload object files... -r

    checking how to recognize dependent libraries... pass_all

    checking for ar... ar

    checking for strip... strip

    checking for ranlib... ranlib

    checking command to parse /usr/bin/nm -B output from gcc object... ok

    checking how to run the C preprocessor... gcc -E

    checking for ANSI C header files... yes

    checking for sys/types.h... yes

    checking for sys/stat.h... yes

    checking for stdlib.h... yes

    checking for string.h... yes

    checking for memory.h... yes

    checking for strings.h... yes

    checking for inttypes.h... yes

    checking for stdint.h... yes

    checking for unistd.h... yes

    checking for dlfcn.h... yes

    checking for objdir... .libs

    checking if gcc supports -fno-rtti -fno-exceptions... no

    checking for gcc option to produce PIC... -fPIC -DPIC

    checking if gcc PIC flag -fPIC -DPIC works... yes

    checking if gcc static flag -static works... no

    checking if gcc supports -c -o file.o... yes

    checking if gcc supports -c -o file.o... (cached) yes

    checking whether the gcc linker (/usr/bin/ld -m elf_x86_64) supports shared libraries... yes

    checking whether -lc should be explicitly linked in... no

    checking dynamic linker characteristics... GNU/Linux ld.so

    checking how to hardcode library paths into programs... immediate

    checking whether stripping libraries is possible... yes

    checking if libtool supports shared libraries... yes

    checking whether to build shared libraries... yes

    checking whether to build static libraries... no

    checking for logf in -lm... yes

    checking fcntl.h usability... yes

    checking fcntl.h presence... yes

    checking for fcntl.h... yes

    checking netinet/in.h usability... yes

    checking netinet/in.h presence... yes

    checking for netinet/in.h... yes

    checking math.h usability... yes

    checking math.h presence... yes

    checking for math.h... yes

    checking for stdlib.h... (cached) yes

    checking for string.h... (cached) yes

    checking sys/file.h usability... yes

    checking sys/file.h presence... yes

    checking for sys/file.h... yes

    checking sys/param.h usability... yes

    checking sys/param.h presence... yes

    checking for sys/param.h... yes

    checking sys/time.h usability... yes

    checking sys/time.h presence... yes

    checking for sys/time.h... yes

    checking for unistd.h... (cached) yes

    checking for an ANSI C-conforming const... yes

    checking for inline... inline

    checking whether time.h and sys/time.h may both be included... yes

    checking size of int... 4

    checking size of float... 4

    checking for struct flock...

    checking whether lstat correctly handles trailing slash... yes

    checking whether lstat accepts an empty string... no

    checking whether lstat correctly handles trailing slash... (cached) yes

    checking for stdlib.h... (cached) yes

    checking for unistd.h... (cached) yes

    checking for sys/param.h... (cached) yes

    checking for getpagesize... yes

    checking for working mmap... yes

    checking for working memcmp... yes

    checking for flock... yes

    checking for gettimeofday... yes

    checking for malloc... yes

    checking for memset... yes

    checking for munmap... yes

    checking for pow... yes

    checking for realpath... yes

    checking for strcasecmp... yes

    checking for strchr... yes

    checking for strdup... yes

    checking for strrchr... yes

    checking for strndup... yes

    checking for strtok_r... yes

    configure: creating ./config.status

    config.status: creating Makefile

    config.status: creating cli/Makefile

    config.status: creating etc/Makefile

    config.status: creating libscws/Makefile

    config.status: creating libscws/version.h

    config.status: creating config.h

    config.status: executing depfiles commands

    config.status: executing libtool commands

    继续报错!!

    [root@jxstar-dev scws-1.2.2]# make isntall

    make: *** 没有规则可以创建目标“isntall”。 停止。///输错单词了install

    再次执行

    [root@jxstar-dev scws-1.2.2]# make install

    Making install in .

    make[1]: 进入目录“/home/scws-1.2.2”

    make[2]: 进入目录“/home/scws-1.2.2”

    make[2]: 对“install-exec-am”无需做任何事。

    make[2]: 对“install-data-am”无需做任何事。

    make[2]: 离开目录“/home/scws-1.2.2”

    make[1]: 离开目录“/home/scws-1.2.2”

    Making install in libscws

    make[1]: 进入目录“/home/scws-1.2.2/libscws”

    /bin/sh ../libtool --preserve-dup-deps --tag=CC --mode=compile gcc -DHAVE_CONFIG_H -I. -I.. -g -O2 -MT charset.lo -MD -MP -MF .deps/charset.Tpo -c -o charset.lo charset.c

    libtool: compile: gcc -DHAVE_CONFIG_H -I. -I.. -g -O2 -MT charset.lo -MD -MP -MF .deps/charset.Tpo -c charset.c -fPIC -DPIC -o .libs/charset.o

    mv -f .deps/charset.Tpo .deps/charset.Plo

    /bin/sh ../libtool --preserve-dup-deps --tag=CC --mode=compile gcc -DHAVE_CONFIG_H -I. -I.. -g -O2 -MT crc32.lo -MD -MP -MF .deps/crc32.Tpo -c -o crc32.lo crc32.c

    libtool: compile: gcc -DHAVE_CONFIG_H -I. -I.. -g -O2 -MT crc32.lo -MD -MP -MF .deps/crc32.Tpo -c crc32.c -fPIC -DPIC -o .libs/crc32.o

    mv -f .deps/crc32.Tpo .deps/crc32.Plo

    /bin/sh ../libtool --preserve-dup-deps --tag=CC --mode=compile gcc -DHAVE_CONFIG_H -I. -I.. -g -O2 -MT pool.lo -MD -MP -MF .deps/pool.Tpo -c -o pool.lo pool.c

    libtool: compile: gcc -DHAVE_CONFIG_H -I. -I.. -g -O2 -MT pool.lo -MD -MP -MF .deps/pool.Tpo -c pool.c -fPIC -DPIC -o .libs/pool.o

    mv -f .deps/pool.Tpo .deps/pool.Plo

    /bin/sh ../libtool --preserve-dup-deps --tag=CC --mode=compile gcc -DHAVE_CONFIG_H -I. -I.. -g -O2 -MT scws.lo -MD -MP -MF .deps/scws.Tpo -c -o scws.lo scws.c

    libtool: compile: gcc -DHAVE_CONFIG_H -I. -I.. -g -O2 -MT scws.lo -MD -MP -MF .deps/scws.Tpo -c scws.c -fPIC -DPIC -o .libs/scws.o

    mv -f .deps/scws.Tpo .deps/scws.Plo

    /bin/sh ../libtool --preserve-dup-deps --tag=CC --mode=compile gcc -DHAVE_CONFIG_H -I. -I.. -g -O2 -MT xdict.lo -MD -MP -MF .deps/xdict.Tpo -c -o xdict.lo xdict.c

    libtool: compile: gcc -DHAVE_CONFIG_H -I. -I.. -g -O2 -MT xdict.lo -MD -MP -MF .deps/xdict.Tpo -c xdict.c -fPIC -DPIC -o .libs/xdict.o

    mv -f .deps/xdict.Tpo .deps/xdict.Plo

    /bin/sh ../libtool --preserve-dup-deps --tag=CC --mode=compile gcc -DHAVE_CONFIG_H -I. -I.. -g -O2 -MT darray.lo -MD -MP -MF .deps/darray.Tpo -c -o darray.lo darray.c

    libtool: compile: gcc -DHAVE_CONFIG_H -I. -I.. -g -O2 -MT darray.lo -MD -MP -MF .deps/darray.Tpo -c darray.c -fPIC -DPIC -o .libs/darray.o

    mv -f .deps/darray.Tpo .deps/darray.Plo

    /bin/sh ../libtool --preserve-dup-deps --tag=CC --mode=compile gcc -DHAVE_CONFIG_H -I. -I.. -g -O2 -MT rule.lo -MD -MP -MF .deps/rule.Tpo -c -o rule.lo rule.c

    libtool: compile: gcc -DHAVE_CONFIG_H -I. -I.. -g -O2 -MT rule.lo -MD -MP -MF .deps/rule.Tpo -c rule.c -fPIC -DPIC -o .libs/rule.o

    mv -f .deps/rule.Tpo .deps/rule.Plo

    /bin/sh ../libtool --preserve-dup-deps --tag=CC --mode=compile gcc -DHAVE_CONFIG_H -I. -I.. -g -O2 -MT lock.lo -MD -MP -MF .deps/lock.Tpo -c -o lock.lo lock.c

    libtool: compile: gcc -DHAVE_CONFIG_H -I. -I.. -g -O2 -MT lock.lo -MD -MP -MF .deps/lock.Tpo -c lock.c -fPIC -DPIC -o .libs/lock.o

    mv -f .deps/lock.Tpo .deps/lock.Plo

    /bin/sh ../libtool --preserve-dup-deps --tag=CC --mode=compile gcc -DHAVE_CONFIG_H -I. -I.. -g -O2 -MT xdb.lo -MD -MP -MF .deps/xdb.Tpo -c -o xdb.lo xdb.c

    libtool: compile: gcc -DHAVE_CONFIG_H -I. -I.. -g -O2 -MT xdb.lo -MD -MP -MF .deps/xdb.Tpo -c xdb.c -fPIC -DPIC -o .libs/xdb.o

    mv -f .deps/xdb.Tpo .deps/xdb.Plo

    /bin/sh ../libtool --preserve-dup-deps --tag=CC --mode=compile gcc -DHAVE_CONFIG_H -I. -I.. -g -O2 -MT xtree.lo -MD -MP -MF .deps/xtree.Tpo -c -o xtree.lo xtree.c

    libtool: compile: gcc -DHAVE_CONFIG_H -I. -I.. -g -O2 -MT xtree.lo -MD -MP -MF .deps/xtree.Tpo -c xtree.c -fPIC -DPIC -o .libs/xtree.o

    mv -f .deps/xtree.Tpo .deps/xtree.Plo

    /bin/sh ../libtool --preserve-dup-deps --tag=CC --mode=link gcc -g -O2 -no-undefined -version-info 2:0:1 -o libscws.la -rpath /usr/local/lib charset.lo crc32.lo pool.lo scws.lo xdict.lo darray.lo rule.lo lock.lo xdb.lo xtree.lo -lm

    libtool: link: gcc -shared .libs/charset.o .libs/crc32.o .libs/pool.o .libs/scws.o .libs/xdict.o .libs/darray.o .libs/rule.o .libs/lock.o .libs/xdb.o .libs/xtree.o -lm -Wl,-soname -Wl,libscws.so.1 -o .libs/libscws.so.1.1.0

    libtool: link: (cd ".libs" && rm -f "libscws.so.1" && ln -s "libscws.so.1.1.0" "libscws.so.1")

    libtool: link: (cd ".libs" && rm -f "libscws.so" && ln -s "libscws.so.1.1.0" "libscws.so")

    libtool: link: ( cd ".libs" && rm -f "libscws.la" && ln -s "../libscws.la" "libscws.la" )

    make[2]: 进入目录“/home/scws-1.2.2/libscws”

    test -z "/usr/local/lib" || /usr/bin/mkdir -p "/usr/local/lib"

    /bin/sh ../libtool --preserve-dup-deps --mode=install /usr/bin/install -c 'libscws.la' '/usr/local/lib/libscws.la'

    libtool: install: /usr/bin/install -c .libs/libscws.so.1.1.0 /usr/local/lib/libscws.so.1.1.0

    libtool: install: (cd /usr/local/lib && { ln -s -f libscws.so.1.1.0 libscws.so.1 || { rm -f libscws.so.1 && ln -s libscws.so.1.1.0 libscws.so.1; }; })

    libtool: install: (cd /usr/local/lib && { ln -s -f libscws.so.1.1.0 libscws.so || { rm -f libscws.so && ln -s libscws.so.1.1.0 libscws.so; }; })

    libtool: install: /usr/bin/install -c .libs/libscws.lai /usr/local/lib/libscws.la

    libtool: finish: PATH="/usr/pgsql-10/bin:/usr/pgsql-10/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/java/jdk1.8.0_221/bin:/root/bin:/sbin" ldconfig -n /usr/local/lib

    ----------------------------------------------------------------------

    Libraries have been installed in:

    /usr/local/lib

    If you ever happen to want to link against installed libraries

    in a given directory, LIBDIR, you must either use libtool, and

    specify the full pathname of the library, or use the `-LLIBDIR'

    flag during linking and do at least one of the following:

    - add LIBDIR to the `LD_LIBRARY_PATH' environment variable

    during execution

    - add LIBDIR to the `LD_RUN_PATH' environment variable

    during linking

    - use the `-Wl,-rpath -Wl,LIBDIR' linker flag

    - have your system administrator add LIBDIR to `/etc/ld.so.conf'

    See any operating system documentation about shared libraries for

    more information, such as the ld(1) and ld.so(8) manual pages.

    ----------------------------------------------------------------------

    test -z "/usr/local/include/scws" || /usr/bin/mkdir -p "/usr/local/include/scws"

    /usr/bin/install -c -m 644 'charset.h' '/usr/local/include/scws/charset.h'

    /usr/bin/install -c -m 644 'crc32.h' '/usr/local/include/scws/crc32.h'

    /usr/bin/install -c -m 644 'pool.h' '/usr/local/include/scws/pool.h'

    /usr/bin/install -c -m 644 'scws.h' '/usr/local/include/scws/scws.h'

    /usr/bin/install -c -m 644 'xdict.h' '/usr/local/include/scws/xdict.h'

    /usr/bin/install -c -m 644 'darray.h' '/usr/local/include/scws/darray.h'

    /usr/bin/install -c -m 644 'rule.h' '/usr/local/include/scws/rule.h'

    /usr/bin/install -c -m 644 'xdb.h' '/usr/local/include/scws/xdb.h'

    /usr/bin/install -c -m 644 'xtree.h' '/usr/local/include/scws/xtree.h'

    /usr/bin/install -c -m 644 'version.h' '/usr/local/include/scws/version.h'

    make[2]: 离开目录“/home/scws-1.2.2/libscws”

    make[1]: 离开目录“/home/scws-1.2.2/libscws”

    Making install in cli

    make[1]: 进入目录“/home/scws-1.2.2/cli”

    gcc -DHAVE_CONFIG_H -I. -I.. -I.. -I../libscws -g -O2 -MT scws_cmd.o -MD -MP -MF .deps/scws_cmd.Tpo -c -o scws_cmd.o scws_cmd.c

    mv -f .deps/scws_cmd.Tpo .deps/scws_cmd.Po

    /bin/sh ../libtool --preserve-dup-deps --tag=CC --mode=link gcc -g -O2 -o scws scws_cmd.o ../libscws/libscws.la -lm

    libtool: link: gcc -g -O2 -o .libs/scws scws_cmd.o ../libscws/.libs/libscws.so -lm -Wl,-rpath -Wl,/usr/local/lib

    gcc -DHAVE_CONFIG_H -I. -I.. -I.. -I../libscws -g -O2 -MT gen_dict.o -MD -MP -MF .deps/gen_dict.Tpo -c -o gen_dict.o gen_dict.c

    mv -f .deps/gen_dict.Tpo .deps/gen_dict.Po

    /bin/sh ../libtool --preserve-dup-deps --tag=CC --mode=link gcc -g -O2 -o scws-gen-dict gen_dict.o ../libscws/libscws.la -lm

    libtool: link: gcc -g -O2 -o .libs/scws-gen-dict gen_dict.o ../libscws/.libs/libscws.so -lm -Wl,-rpath -Wl,/usr/local/lib

    make[2]: 进入目录“/home/scws-1.2.2/cli”

    test -z "/usr/local/bin" || /usr/bin/mkdir -p "/usr/local/bin"

    /bin/sh ../libtool --preserve-dup-deps --mode=install /usr/bin/install -c 'scws' '/usr/local/bin/scws'

    libtool: install: /usr/bin/install -c .libs/scws /usr/local/bin/scws

    /bin/sh ../libtool --preserve-dup-deps --mode=install /usr/bin/install -c 'scws-gen-dict' '/usr/local/bin/scws-gen-dict'

    libtool: install: /usr/bin/install -c .libs/scws-gen-dict /usr/local/bin/scws-gen-dict

    make[2]: 对“install-data-am”无需做任何事。

    make[2]: 离开目录“/home/scws-1.2.2/cli”

    make[1]: 离开目录“/home/scws-1.2.2/cli”

    Making install in etc

    make[1]: 进入目录“/home/scws-1.2.2/etc”

    make[2]: 进入目录“/home/scws-1.2.2/etc”

    test -z "/usr/local/etc" || /usr/bin/mkdir -p "/usr/local/etc"

    /usr/bin/install -c -m 644 'rules.ini' '/usr/local/etc/rules.ini'

    /usr/bin/install -c -m 644 'rules.utf8.ini' '/usr/local/etc/rules.utf8.ini'

    /usr/bin/install -c -m 644 'rules_cht.utf8.ini' '/usr/local/etc/rules_cht.utf8.ini'

    make[2]: 对“install-data-am”无需做任何事。

    make[2]: 离开目录“/home/scws-1.2.2/etc”

    make[1]: 离开目录“/home/scws-1.2.2/etc”

    是否安装成功

    查看 scws 安装目录

    [root@db1 scws-1.2.2]# ls /usr/local/include/scws/

    charset.h crc32.h darray.h pool.h rule.h scws.h version.h xdb.h xdict.h xtree.h

    6:安装zhparser

    https://github.com/amutu/zhparser/archive/master.zip

    [root@jxstar-dev home]# unzip zhparser-master.zip

    Archive: zhparser-master.zip

    127a31b39db1b4ccc851f254683ced9a1fa837bd

    creating: zhparser-master/

    inflating: zhparser-master/CHANGELOG

    inflating: zhparser-master/COPYRIGHT

    inflating: zhparser-master/META.json

    inflating: zhparser-master/Makefile

    inflating: zhparser-master/README.md

    inflating: zhparser-master/check.sh

    inflating: zhparser-master/dict.utf8.xdb

    inflating: zhparser-master/dict_extra.txt

    creating: zhparser-master/expected/

    inflating: zhparser-master/expected/zhparser.out

    inflating: zhparser-master/rules.utf8.ini

    creating: zhparser-master/sql/

    inflating: zhparser-master/sql/zhparser.sql

    inflating: zhparser-master/zhparser--1.0--2.0.sql

    inflating: zhparser-master/zhparser--1.0.sql

    inflating: zhparser-master/zhparser--2.0--2.1.sql

    inflating: zhparser-master/zhparser--2.0.sql

    inflating: zhparser-master/zhparser--2.1.sql

    inflating: zhparser-master/zhparser--unpackaged--1.0.sql

    inflating: zhparser-master/zhparser.c

    inflating: zhparser-master/zhparser.control

    inflating: zhparser-master/zhparser.h

    开始报错:

    [root@jxstar-dev home]# cd zhparser-master/

    [root@jxstar-dev zhparser-master]# SCWS_HOME=/usr/local make&&make install

    make: pg_config:命令未找到

    make: *** 无目标。 停止。

    需要找到你pg_config 如果没有的话

    yum install postgresql-devel

    安装完毕后察看

    /usr/bin/pg_config  可以查看到了

    继续执行

    [root@jxstar-dev zhparser-master]# SCWS_HOME=/usr/local make&&make install

    gcc -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -DLINUX_OOM_SCORE_ADJ=0 -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Wendif-labels -Wmissing-format-attribute -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-precision=standard -fPIC -I/usr/local/include/scws -I. -I. -I/usr/include/pgsql/server -I/usr/include/pgsql/internal -D_GNU_SOURCE -I/usr/include/libxml2 -c -o zhparser.o zhparser.c

    zhparser.c:15:27: 致命错误:utils/varlena.h:没有那个文件或目录

    #include "utils/varlena.h"

    ^

    编译中断。

    make: *** [zhparser.o] 错误 1

    重新配置一下环境变量就好了,不知道为什么,可以评论解释或者加QQ820688215 交流

    [root@jxstar-dev zhparser-master]# export PATH=/usr/pgsql-10/bin:$PATH

    [root@jxstar-dev zhparser-master]# pg_config=/usr/bin/pg_config make && make install   //或者执行 SCWS_HOME=/usr/local make&&make install  一样的

    gcc -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Wendif-labels -Wmissing-format-attribute -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-precision=standard -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -fPIC -I/usr/local/include/scws -I. -I./ -I/usr/pgsql-10/include/server -I/usr/pgsql-10/include/internal -D_GNU_SOURCE -I/usr/include/libxml2 -I/usr/include -c -o zhparser.o zhparser.c

    gcc -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Wendif-labels -Wmissing-format-attribute -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-precision=standard -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -fPIC -shared -o zhparser.so zhparser.o -L/usr/pgsql-10/lib -Wl,--as-needed -L/usr/lib64 -Wl,--as-needed -Wl,-rpath,'/usr/pgsql-10/lib',--enable-new-dtags -lscws -L/usr/local/lib -Wl,-rpath -Wl,/usr/local/lib

    /bin/mkdir -p '/usr/pgsql-10/lib'

    /bin/mkdir -p '/usr/pgsql-10/share/extension'

    /bin/mkdir -p '/usr/pgsql-10/share/extension'

    /bin/mkdir -p '/usr/pgsql-10/share/tsearch_data'

    /bin/install -c -m 755 zhparser.so '/usr/pgsql-10/lib/zhparser.so'

    /bin/install -c -m 644 .//zhparser.control '/usr/pgsql-10/share/extension/'

    /bin/install -c -m 644 .//zhparser--1.0.sql .//zhparser--unpackaged--1.0.sql .//zhparser--1.0--2.0.sql .//zhparser--2.0.sql .//zhparser--2.0--2.1.sql .//zhparser--2.1.sql '/usr/pgsql-10/share/extension/'

    /bin/install -c -m 644 .//dict.utf8.xdb .//rules.utf8.ini '/usr/pgsql-10/share/tsearch_data/'

    到此安装完毕!

    开始使用一下:

    切换到postgres账户

    创建extension

    整理好这些文件后,就可以继续创建extension了。

    切换到postgres账户

    su - postgres

    ·3.2.2 安装扩展(每新建一个数据库都需要执行这一步;这里我直接使用的已有的一个测试数据库)

    #查询已有的解析器

    knowledge=# \dFp

    [root@jxstar-dev zhparser-master]# su postgres

    bash-4.2$ psql -Upostgres

    psql (10.15)

    输入 "help" 来获取帮助信息.

    postgres=# \dFp

    文本剖析器列表

    架构模式 | 名称 | 描述

    ------------+---------+---------------------

    pg_catalog | default | default word parser

    (1 行记录)

    postgres=#

    postgres=# create extension zhparser;

    CREATE EXTENSION

    postgres=# \dFp

    文本剖析器列表

    架构模式 | 名称 | 描述

    ------------+----------+---------------------

    pg_catalog | default | default word parser

    public | zhparser |

    (2 行记录)

    postgres=# CREATE TEXT SEARCH CONFIGURATION testzhcfg (PARSER = zhparser);

    CREATE TEXT SEARCH CONFIGURATION

    postgres=# ALTER TEXT SEARCH CONFIGURATION testzhcfg ADD MAPPING FOR n,v,a,i,e,l WITH simple;

    ALTER TEXT SEARCH CONFIGURATION

    创建名为testzhcfg的 可以在sql中使用的解析器

    -- make test configuration using parser

    //这样解析器就添加到当前数据库了。但是此时还是不能用,还需要创建使用zhparser作为解析器的全文搜索的配置,也就是需要给zhparser解析器

    取一个在sql里面可以使用的名字。这里测试取的是(‘testzhcfg ’)。

    CREATE TEXT SEARCH CONFIGURATION testzhcfg (PARSER = zhparser);

    -- add token mapping

    ALTER TEXT SEARCH CONFIGURATION testzhcfg ADD MAPPING FOR n,v,a,i,e,l WITH simple;

    //#查询已有的解析器

    knowledge=# \dFp

    /测试

    -- ts_parse

    SELECT * FROM ts_parse('zhparser', 'hello world! 2010年保障房建设在全国范围内获全面启动,从中央到地方纷纷加大 了保障房的建设和投入

    力度 。2011年,保障房进入了更大规模的建设阶段。住房城乡建设部党组书记、部长姜伟新去年底在全国住房城乡建设工作会议上表示,要继续推

    进保障性安居工程建设。');

    -- test to_tsvector

    SELECT to_tsvector('testzhcfg','“今年保障房新开工数量虽然有所下调,但实际的年度在建规模以及竣工规模会超以往年份,相对应的对资金的

    需求也会创历>史纪录。”陈国强说。在他看来,与2011年相比,2012年的保障房建设在资金配套上的压力将更为严峻。');

    -- test to_tsquery

    SELECT to_tsquery('testzhcfg', '保障房资金压力');

    展开全文
  • 前言 PostgreSQL 被称为是“最高级的开源数据库”,它的数据类型非常丰富,...由于 PgSQL 国内的资料较少,迁移过程踩了不少坑,这里总结记录一下,帮助后来的同学能顺利使用 PgSQL。而且目前在灰度测试刚布了一台...

     

    前言

    PostgreSQL 被称为是“最高级的开源数据库”,它的数据类型非常丰富,用它来解决一些比较偏门的需求非常适合。

    前些天将 POI 点关键词查询的功能迁到了 PgSQL,总算对前文 空间索引 - 各数据库空间索引使用报告 有了一个交代。

    由于 PgSQL 国内的资料较少,迁移过程踩了不少坑,这里总结记录一下,帮助后来的同学能顺利使用 PgSQL。而且目前在灰度测试刚布了一台机器,后续可能还要添加机器,整理一下流程总是好的。

    文章经常被人爬,而且还不注明原地址,我在这里的更新和纠错没法同步,这里注明一下原文地址:http://www.cnblogs.com/zhenbianshu/p/7795247.html


    开始

    安装

    首先是安装 PgSQL,这里我使用的是 PgSQL 9.6,PgSQL 10 也刚发布了,有兴趣的可以尝下鲜。

    PgSQL 的安装可以说非常复杂了,除了要安装 Server 和 Client 外,还需要安装 devel 包。为了实现空间索引功能,我们还要安装最重要的 PostGIS 插件,此插件需要很多依赖,自己手动安装非常复杂而且很可能出错。

    推荐自动化方式安装,Yum 一定要配合 epel 这样的 Yum 源,保障能将依赖一网打尽。当然最好的还是使用 docker 来运行,找个镜像就行了。

    插件

    由于 PgSQL 的很多功能都由插件实现,所以还要安装一些常用的插件,如:

    postgis_topology(管理面、边、点等拓扑对象)
    pgrouting(路径规划)
    postgis_sfcgal(实现3D相关算法)
    fuzzystrmatch(字符串相似度计算)
    address_standardizer/address_standardizer_data_us(地址标准化)
    pg_trgm(分词索引)

    这些插件在安装目录 /path/extensions 下编译完毕后,在数据库中使用前要先使用 create extension xxx 启用。

    启动

    1. 切换到非 root 用户。(PgSQL 在安装完毕后会创建一个名为 postgres 的超级用户,我们可以使用这个超级用户来操作 PgSQL,后期建议重新创建一个普通用户用来管理数据);
    2. 切换到 /installPath/bin/ 目录下,PgSQL 在此目录下提供了很多命令,如 createdb、createuser、dropdb、pg_dump 等;
    3. 使用 createdb 命令初始化一个文件夹 dir_db (此目录不能已存在)存放数据库物理数据,使用 -E UTF8 参数指定数据库字符集为 utf-8;
    4. 使用 pg_ctl -D dir_db 指定数据库启动后台服务;
    5. 使用 psql -d db 在命令行登陆 PgSQL;

    配置

    安装完毕后还要配置一些比较基本的参数才能正常使用。

    Host权限

    PgSQL需要在 pg_hba.conf 文件中配置数据库 Host 权限,才能被其他机器访问。

    # TYPE  DATABASE        USER            ADDRESS                 METHOD
    local   all             all                                     trust
    host    all             all             127.0.0.1/32            md5
    host    all             all             172.16.0.1/16            md5

    文件中注释部分对这几个字段介绍得比较详细, 我们很可能需要添加 host(IP) 访问项, ADDRESS 是普通的网段表示法,METHOD 推荐使用 md5,表示使用 md5 加密传输密码。

    服务器配置

    服务器配置在 postgresql.conf中,修改配置后需要 使用 pg_ctl restart -D dir_db 命令重启数据库;

    此外,我们也可以在登陆数据库后修改配置项:使用 SELECT * FROM pg_settings WHERE name = 'config'; 查询当前配置项,再使用 UPDATE 语句更新配置。但有些配置如内存分配策略是只在当前 session 生效的,全局生效需要在配置文件中修改,再重启服务器。

    我们可以修改配置并用客户端验证 SQL 语句的优化,使用 \timing on 开启查询计时,使用 EXPLAIN ANALYSE 语句 分析查询语句效率。 下面介绍两个已实践过的配置参数:

    • shared_buffers:用于指定共享内存缓冲区所占用的内存量。它应该足够大来存储常使用的查询结果,以减少物理I/O。但它也不能太大,以避免系统 内存swap 的发生, 一般设置为系统内存的 20%。
    • work_mem:一个连接的工作内存,在查询结果数据量较大时,此值如果较小的话,会导致大量系统 I/O,导致查询速度急剧下降,如果你的 explain 语句内 buffer 部分 read数值过大,则表示工作内存不足,需要调整加此参数。但此值也不能太大,需要保证 work_mem * max_connections + shared_buffers + 系统内存 < RAM,不然同样可能会导致系统 内存swap。

    这样,PgSQL 就能作为一个正常的关系型数据使用了。


    分词

    全文索引的实现要靠 PgSQL 的 gin 索引。分词功能 PgSQL 内置了英文、西班牙文等,但中文分词需要借助开源插件 zhparser

    SCWS

    要使用 zhparser,我们首先要安装 SCWS 分词库,SCWS 是 Simple Chinese Word Segmentation 的首字母缩写(即:简易中文分词系统),其 GitHub 项目地址为 hightman-scws,我们下载之后可以直接安装。

    安装完后,就可以在命令行中使用 scws 命令进行测试分词了, 其参数主要有:

    • -c utf8 指定字符集
    • -d dict 指定字典 可以是 xdb 或 txt 格式
    • -M 复合分词的级别, 1~15,按位异或的 1|2|4|8 依次表示 短词|二元|主要字|全部字,默认不复合分词,这个参数可以帮助调整到最想要的分词效果。

    zhpaser

    1. 下载 zhparser 源码 git clone https:github.com/amutu/zhparser.git
    2. 安装前需要先配置环境变量:export PATH=$PATH:/path/to/pgsql
    3. make && make install编译 zhparser;
    4. 登陆 PgSQL 使用 CREATE EXTENSION zhparser; 启用插件;
    5. 添加分词配置

      CREATE TEXT SEARCH CONFIGURATION parser_name (PARSER = zhparser); // 添加配置
      ALTER TEXT SEARCH CONFIGURATION parser_name ADD MAPPING FOR n,v,a,i,e,l,j WITH simple; // 设置分词规则 (n 名词 v 动词等,详情阅读下面的文档)
    6. 给某一列的分词结果添加 gin 索引 create index idx_name on table using gin(to_tsvector('parser_name', field));

    7. 在命令行中使用上一节中介绍的 scws 命令测试分词配置,如我认为复合等级为 7 时分词结果最好,则我在 postgresql.conf添加配置

      zhparser.multi_short = true #短词复合: 1
      zhparser.multi_duality = true  #散字二元复合: 2
      zhparser.multi_zmain = true  #重要单字复合: 4
      zhparser.multi_zall = false  #全部单字复合: 8

    SQL

    查询中我们可以使用最简单的 SELECT * FROM table WHERE to_tsvector('parser_name', field) @@ 'word' 来查询 field 字段分词中带有 word 一词的数据;

    使用 to_tsquery() 方法将句子解析成各个词的组合向量,如 国家大剧院 的返回结果为 '国家' & '大剧院' & '大剧' & '剧院' ,当然我们也可以使用 & | 符号拼接自己需要的向量;在查询 长句 时,可以使用 SELECT * FROM table WHERE to_tsvector('parser_name', field) @@ to_tsquery('parser_name','words')

    有时候我们想像 MySQL 的 SQL_CALC_FOUND_ROWS 语句一样同步返回结果条数,则可以使用 SELECT COUNT(*) OVER() AS score FROM table WHERE ...,PgSQL 会在每一行数据添加 score 字段存储查询到的总结果条数;

    到这里,普通的全文检索需求已经实现了。


    优化

    我们接着对分词效果和效率进行优化:

    存储分词结果

    我们可以使用一个字段来存储分词向量,并在此字段上创建索引来更优地使用分词索引:

    ALTER TABLE table ADD COLUMN tsv_column tsvector;           // 添加一个分词字段
    UPDATE table SET tsv_column = to_tsvector('parser_name', coalesce(field,''));   // 将字段的分词向量更新到新字段中
    CREATE INDEX idx_gin_zhcn ON table USING GIN(tsv_column);   // 在新字段上创建索引
    CREATE TRIGGER trigger_name BEFORE INSERT OR UPDATE  ON table FOR EACH ROW EXECUTE PROCEDURE
    tsvector_update_trigger(tsv_column, 'parser_name', field); // 创建一个更新分词触发器

    这样,再进行查询时就可以直接使用 SELECT * FROM table WHERE tsv_column @@ 'keyword' 了。

    这里需要注意,这时候在往表内插入数据的时候,可能会报错,提示指定 parser_name 的 schema, 这时候可以使用 \dF 命令查看所有 text search configuration 的参数:

                   List of text search configurations
       Schema   |    Name    |              Description
    ------------+------------+---------------------------------------
     pg_catalog | english    | configuration for english language
     public     | myparser   |

    注意 schema 参数,在创建 trigger 时需要指定 schema, 如上面,就需要使用 public.myparser

    添加自定义词典

    我们可以在网上下载 xdb 格式的词库来替代默认词典,词库放在 share/tsearch_data/ 文件夹下才能被 PgSQL 读取到,默认使用的词库是 dict.utf8.xdb。要使用自定义词库,可以将词库放在词库文件夹后,在 postgresql.conf 配置 zhparser.extra_dict="mydict.xdb" 参数;

    当我们只有 txt 的词库,想把这个词库作为默认词库该怎么办呢?使用 scws 带的scwe-gen-dict 工具或网上找的脚本生成 xdb 后放入词库文件夹后,在 PgSQL 中分词一直报错,读取词库文件失败。我经过多次实验,总结出了一套制作一个词典文件的方法:

    1. 准备词库源文件 mydict.txt:词库文件的内容每一行的格式为词 TF IDF 词性,词是必须的,而 TF 词频(Term Frequency)、IDF 反文档频率(Inverse Document Frequency) 和 词性 都是可选的,除非确定自己的词典资料是对的且符合 scws 的配置,不然最好还是留空,让 scws 自已确定;
    2. postgresql.conf 中设置 zhparser.extra_dicts = "mydict.txt" 同时设置 zhparser.dict_in_memory = true
    3. 命令行进入 PgSQL,执行一条分词语句 select to_tsquery('parser', '随便一个词') ,分词会极慢,请耐心(请保证此时只有一个分词语句在执行);
    4. 分词成功后,在/tmp/目录下找到生成的 scws-xxxx.xdb 替换掉 share/tsearch_data/dict.utf8.xdb
    5. 删除刚加入的 extra_dicts dict_in_memory 配置,重启服务器。

    扩展

    由于查询的是 POI 的名称,一般较短,且很多词并无语义,又考虑到用户的输入习惯,一般会输入 POI 名称的前几个字符,而且 scws 的分词准确率也不能达到100%,于是我添加了名称的前缀查询来提高查询的准确率,即使用 B树索引 实现 LIKE '关键词%' 的查询。这里需

    这里要注意的是,创建索引时要根据字段类型配置 操作符类,不然索引可能会不生效,如在 字段类型为 varchar 的字段上创建索引需要使用语句CREATE INDEX idx_name ON table(COLUMN varchar_pattern_ops),这里的 varcharpatternops 就是操作符类,操作符类的介绍和选择可以查看文档:11.9. 操作符类和操作符族

    自此,一个良好的全文检索系统就完成了。


    总结

    简单的数据迁移并不是终点,后续要做的还有很多,如整个系统的数据同步、查询效率优化、查询功能优化(添加拼音搜索、模糊搜索)等。特别是查询效率,不知道是不是我配置有问题,完全达不到那种 E级毫秒 的速度,1kw 的数据效率在进行大结果返回时就大幅下降(200ms),只好老老实实地提前进行了分表,目前百万级查询速度在 20ms 以内,优化还有一段路要走。

    不过这次倒是对 技术的“生态”有了个更深的体会,这方面 PgSQL 确实和 MySQL 差远了,使用 MySQL 时再奇葩的问题都能在网上快速找到答案,而 PgSQL 就尴尬了,入门级的问题搜索 stackoverflow 来来回回就那么几个对不上的回答。虽然也有阿里的“德哥”一样的大神在辛苦布道,但用户的数量才是根本。不过,随着 PgSQL 越来越完善,使用它的人一定会越来越多的,我这篇文章也算是为 PgSQL 加温了吧,哈哈~希望能帮到后来的使用者。

    关于本文有什么问题可以在下面留言交流,如果您觉得本文对您有帮助,可以点击下面的 推荐 支持一下我,博客一直在更新,欢迎 关注

    参考:

    PostgreSQL系统配置优化

    [PG]使用 zhparser 进行中文分词全文检索

    SCWS 中文分词

    Fast Search Using PostgreSQL Trigram Indexes

    使用阿里云PostgreSQL zhparser时不可不知的几个参数

    德哥的PostgreSQL私房菜 - 史上最屌PG资料合集

    转载于:https://www.cnblogs.com/zhenbianshu/p/7795247.html

    展开全文
  • 在使用mysql数据库过程中,如果想实现全文检索的优化,可以使用mysql自带全文索引,但是不支持中文。。关于sphinx的安装网上很多教程写的都不错比如:http://www.coreseek.cn/products-install/。这里就不再说明安装...
  •  全文检索大体分两个部分:索引创建(Indexing)和搜索索引(Search)  1. 索引过程:  1) 有一系列被索引文件(此处所指即数据库数据)  2) 被索引文件经过语法分析和语言处理形成一系列词(Term)。  3) ...
  • 前言PostgreSQL 被称为是“最高级的开源数据库”,它...由于 PgSQL 国内的资料较少,迁移过程踩了不少坑,这里总结记录一下,帮助后来的同学能顺利使用 PgSQL。而且目前在灰度测试刚布了一台机器,后续可能还要添加...
  • 最近在给公司的一个产品做中文全文检索的功能,由于目前所有的数据都是基于postgreSQL的,所以需要一个基于该数据库做一个中文分词的处理。鉴于网上很多资料安装混乱,特将我自己的亲自安装的过程记录下来,方便大家...
  • 什么是全文检索,如何实现全文检索 Lucene实现全文检索的流程 创建索引 查询索引 配置开发环境 入门程序 分析器的分析过程 测试分析器的分词效果 第三方中文分析器 索引库维护 添加文档 删除文档 ...
  • 上文 使用PostgreSQL进行中文全文检索 中我使用 PostgreSQL 搭建完成了一套中文全文检索系统,对数据库配置和分词都进行了优化,基本的查询完全可以支持,但是在使用过程中还是发现了一些很恼人的问题,包括查询效果...
  • [pg]postgresql的中文分词以及全文索引

    千次阅读 2019-05-18 10:00:46
    使用PostgreSQL进行中文全文检索 摘录 前言 PostgreSQL 被称为是“最高级的开源数据库”,它的数据类型非常丰富,用它来解决一些比较偏门的需求非常适合。 前些天将 POI 点关键词查询的功能迁到了 PgSQL,总算对前...
  • 资源名称:MySQL数据库基础与实例教程内容简介: MySQL数据库基础与实例教程 中文PPT版一书使用量身定制的案例全面讲解MySQL基础知识以及MySQL5.6新特性,InnoDB全文检索、触发器、存储过程、函数、事务、锁等概念...
  • 但是,该引擎是不支持中文全文检索(先建立索引,再对索引进行搜索的过程就叫全文(Full-text Search))。同时,该引擎启动也比较慢,并且不会保存表的行数。当进行select * from table指令时,需扫描全表。 优点:...
  • 大学文献检索资料 DOC

    2009-11-28 10:35:24
    文献信息检索实际上包括文献的存储和文献的检索两个相互依存的过程。 二、信息检索的步骤: 1.分析研究课题: 2.选择检索工具: 3.确定检索途径:分类途径、主题途径、题名途径、著作途径、号码途径、其他途径。 ...
  • 搜索引擎的系统架构 这里主要针对全文检索搜索引擎的系统架构进行说明,下文中提到的搜索引擎如果没有特殊说明也是指全文检索搜索引擎。搜索引擎的实现原理,可以看作四步:从互联网上抓取网页→建立索引数据库→在...
  • 原文发布在http://paomadeng.javaeye.com/blog/125838OSPod.Forum希望能够成为跨数据库的应用产品,因此在全文检索的技术方案上没有选择数据库全文检索方案,毕竟象MySQL这样的开源数据库或者HSQL这样的袖珍数据要...
  • 全文检索前段时间做一个全文搜索的dd使用OracleText来建立全文索引和实现全文检索然后在数据库端建立分页存储过程来进行全文检索 信息抽取这样,只要处理表示层的一些问题了 包括,抽取检索文本中与用户需求最想...
  • 高性能MySQL(第3版) 中文PDF带目录清晰版 《高性能MySQL(第3版)》是MySQL 领域的...优化高级查询特性,如全文检索,充分利用多核处理器和固态硬盘等硬件带来的优势,探索备份和恢复策略——包括新的在线热备份工具。
  • 之前由于时间紧,一直心心念念做个完整的搜索没有实现,只用了数据库简单查询做了一下标题的搜索,今天记录下完整的实现过程。 首先安装包: pip install django-haystack pip install jieba pip install whoosh ...
  • MYSQL中文手册

    2013-03-11 21:21:34
    3.3.4. 从表检索信息 3.4. 获得数据库和表的信息 3.5. 在批处理模式下使用mysql 3.6. 常用查询的例子 3.6.1. 列的最大值 3.6.2. 拥有某个列的最大值的行 3.6.3. 列的最大值:按组 3.6.4. 拥有某个字段的组间...
  • EndNote 有着易用的界面和强大的文献搜索功能,对中文也支持良好,是科研工作者不可多得的好助手,无论是文献的检索、管理、文献全文的自动获取,还是论文写作过程中的文献引用插入、SCI 期刊模板等方面,均可为用户...
  • 3.3.4. 从表检索信息 3.4. 获得数据库和表的信息 3.5. 在批处理模式下使用mysql 3.6. 常用查询的例子 3.6.1. 列的最大值 3.6.2. 拥有某个列的最大值的行 3.6.3. 列的最大值:按组 3.6.4. 拥有某个字段的组间最大值的...
  • 3.3.4. 从表检索信息 3.4. 获得数据库和表的信息 3.5. 在批处理模式下使用mysql 3.6. 常用查询的例子 3.6.1. 列的最大值 3.6.2. 拥有某个列的最大值的行 3.6.3. 列的最大值:按组 3.6.4. 拥有某个字段的组间最大值的...
  • SQL Server技术手册.rar

    2020-07-04 17:30:30
    SQL Server技术手册是对SQLServer数据库的详细介绍以及使用教程。中文讲解,内容详细,主要包含:DTS、触发器、内外函数、T-SQL、备份恢复、视图、游标、存储过程全文检索、交叉表、事务、索引、设计、等等。

空空如也

空空如也

1 2 3
收藏数 53
精华内容 21
关键字:

中文全文数据库检索过程