精华内容
下载资源
问答
  • 文中主要讲述了ORACLE全文检索技术的安装和使用方法,方法非常简单,进行简单的试用也不存在问题,但是性能测试方面不是很理想,但是由于同我们目前的系统软件架构相符合,在目前的功能中应用应当不存在技术和性能...
  • lucene全文检索实现流程

    千次阅读 2010-07-02 16:41:00
    对于lucene全文检索,可以简约地看看它的7个主要类,这7个类同时也表达了处理全文检索的7个意念。因为数据库比较为人所熟悉,它又与全文检索某些理念极为相似,所以在对下面的概念说明时,将会大量在渗入...

    对于lucene全文检索,可以简约地看看它的7个主要类,这7个类同时也表达了处理全文检索的7个意念。因为数据库比较为人所熟悉,它又与全文检索某些理念极为相似,所以在对下面的概念说明时,将会大量在渗入数据库和全文检索间的类比。
    1)Document :它的中文意思是文档,对于一个文档,通常都包括它的标题、时间、作者、内容。如果让它的意思泛化,它也有文件的意思(相信Lucene的作者在取这个类名的时候也是经过再三斟酌的),对于文件,它可以指一个TXT文本、一个HTML网页、一个PDF文件等等。总而言之,它是映射着某一个具体的文件,这就是它的单位粒度。对应于数据库的概念是记录,英文是Record,weblucene在索引源的xml中就原原本本地采用了这个概念,可参照<weblucene_home>/dump/blog.xml 。

    2)Field :中文意思是字段。汉语的翻译将这个单词的意思表达得更恰如其分了,意思是文字片段,它可以是一个或多个字。字段是文档(Document)的次粒度单位,也是检索的最基本单位。注意这个概念跟在搜索引擎的输入框中随意输入的那几个字或几组字不是一样的,在搜索输入框中输入的那些文字首先需要经过一个QueryParser(这也是7个类中的一个)将其分解成真正的Field。 在数据库中本来就有Field 这个概念,它即是Record的次级单位。在数据库一条或多条记录怎么被找出来的,往往就经由对Field的检索而得来。在全文检索中Document的最终取得也是差不多,它是根据现在的某个Filed来决定的。即根据文档中的某些还不完整的东西牵引出它的所需的全部。
    示例代码:

    代码内容
    [com.chedong.weblucene.search.WebLuceneResultSetTest]
    Document doc = new Document();
    doc.add(Field.Keyword("keyword", "房地产"));
    doc.add(Field.Keyword("keyword", "非典"));


    3)IndexWriter :索引书写者
    示例代码:
    [org.apache.lucene.index.TestIndexWriter]

    代码内容
    Document doc = new Document();
    doc.add(Field.UnStored("content", "aaa"));
    try {
    IndexWriter writer = new IndexWriter(dir, new WhitespaceAnalyzer(), true);
    writer.addDocument(doc);
    }
    catch (IOException e) {
    e.printStackTrace();
    }


    它的构造器new IndexWriter(dir, new WhitespaceAnalyzer(), true) 有三个参数,分别是Directory对象、分析器对象(这是下一个要介绍的类)和一个布尔量,是否要重写索引就是由这个布尔量标明的,如果取false则仅仅是将索引附加上来。

    4)Analyzer : 分析器,它将目录中的一组原始文件分析成由一组Document和它相应的次级粒度Field组成的索引。因为不同的文件类型,同样的文本其内部文件流组织形式是不一样的,所以需要不同的分析器处理不同的文件类型(如PDFAnalyzer、HtmlAnalyzer)。又因为不同的文字语言处理Field拆分(Token)上是不一样的,所以在语言角度上又有另一层分析器的类别区分,如下面这行代码是处理普通中文字符的
    [com.chedong.weblucene.search.WebLuceneResultSetTest]
    IndexWriter writer = new IndexWriter(dir, new CJKAnalyzer(), true);

    5)QueryParser :这前面在区分Field和用户输入的搜索关键字时已经提及了。(它所用的词是Query,跟数据库所用的是一个概念的,这个词同样的检索上让人感觉没有像Search那么费尽心思去深究。)QueryParser并没有实际地去做查询工作,它只是Parser(剖析)用户输入的东西,并把剖析的结果以一种规则的形式送给Searcher去执行一个真正的搜索。作为剖析的结果,不仅仅是Field,还有Field们相互间的关系(terms,譬如逻辑和AND,逻辑或OR, 逻辑非NOT)。

    6)Searcher : 搜索一个Query,将结果返回。
    [org.apache.lucene.search..TestNot]

    代码内容
    RAMDirectory store = new RAMDirectory();
    IndexWriter writer = new IndexWriter(store, new SimpleAnalyzer(), true);

    Document d1 = new Document();
    d1.add(Field.Text("field", "a b"));

    writer.addDocument(d1);
    writer.optimize();
    writer.close();

    Searcher searcher = new IndexSearcher(store);
    Query query = QueryParser.parse("a NOT b", "field", new SimpleAnalyzer());
    //System.out.println(query);
    Hits hits = searcher.search(query);


    对于每一个搜索器对象,它都需要指定一个索引文件路径,然后由搜索器对Query对象执行查询。 上面的这个类袖珍地对7个主要类都均有涉及。

    7)Hits : Lucene的类注释是:A ranked list of documents, used to hold search results. 搜索的结果不仅仅是一些文档,而且这些文档还是有级别的,这个级别是对于先后次序而言的。它对应于数据库中的RecordSet / ResultSet 。

    展开全文
  • 自己在写一个web,希望对数据库全文检索。但是google了解到,由于中文分词的缘故,mysql只支持英文的全文搜索,想支持中文的,需要各种插件or实现一些比较复杂的机制,而买的虚拟主机并不支持这些复杂的东西。仔细...

    自己在写一个web,希望对数据库做全文检索。但是google了解到,由于中文分词的缘故,mysql只支持英文的全文搜索,想支持中文的,需要各种插件or实现一些比较复杂的机制,而买的虚拟主机并不支持这些复杂的东西。仔细想了下,因为自己需求的功能也比较简单,主要是2个字段的搜索,且数据量不大,即便增加几个字段,需要多运行几个select也不会对速度有太大影响,所以通过一些work around实现了需求。

    Step 1:用locate进行简单的搜索

    Locate可以判断子串是否在子乱

    有两个column,一个name,一个description.

    所以可以用LOCATE>0去判断是否关键字在其中出现了。

    其实就是

    SELECT * FROM table WHERE LOCATE(key, 'name')>0 OR LOCATE(key, 'description);

    这样,我们就简单实现了对某个key在两个域的搜索

    Step 2:搜索多个关键字

    通常,搜索都是有多个关键字,所以我们需要对每个关键字,执行下Step1的查询。(当然,也可以合成一个,这里偷懒每次只查询1个关键字)

    然后,我们再将每次查询出的数组都合并,这样就得到了一个最终的集合。

    php代码如下:http://blog.chinaunix.net/uid-26456800-id-4242239.html

    展开全文
  • 在ONgDB中主要有模式索引和全文索引,可以支持一些基本的查询,但是在大量数据的时候都会有性能瓶颈。此外全文索引功能还不可以支持数值类型的检索。使用插件集成es之后,可以让图库支持更加复杂的检索并保证高性能...

    在ONgDB中主要有模式索引和全文索引,可以支持一些基本的查询,但是在大量数据的时候都会有性能瓶颈。此外全文索引功能还不可以支持数值类型的检索。使用插件集成es之后,可以让图库支持更加复杂的检索并保证高性能。图数据库事务的CRUD操作都会同步到es,保持数据的一致。

    插件下载

    此插件支持索引中文标签,下载之后按照说明在neo4j.conf中配置对应选项。【创建好mapping之后再启动图库】

    索引的示例配置【在neo4j.conf中配置】

    #********************************************************************
    ## ONgDB ElasticSearch Integration
    ##********************************************************************
    ## elasticsearch.discovery=true
    elasticsearch.host_name=https://localhost:9200
    elasticsearch.index_spec=pre_org_cn_node:PRE公司中文名称(name,hcode,pcode,hupdatetime,cluster_id)
    

    创建索引mapping样例

    索引mapping不建议使用自动生成的字段类,需要自定义设置,用es的put接口生成。图库中的标签与es的索引类型相对应,索引名使用英文定义并且不要和索引集群的其它索引重名。

    • 【Mapping支持不区分大小写查询】put https://localhost:9200/pre_org_cn_node
    {
      "settings": {
        "number_of_replicas": 1,
        "number_of_shards": 6,
        "refresh_interval": "1s",
        "translog": {
          "flush_threshold_size": "1.6gb"
        },
        "merge": {
          "scheduler": {
            "max_thread_count": "1"
          }
        },
        "index": {
          "routing": {
            "allocation": {
              "total_shards_per_node": "3"
            }
          }
        },
        "analysis": {
          "normalizer": {
            "my_normalizer": {
              "type": "custom",
              "filter": [
                "lowercase",
                "asciifolding"
              ]
            }
          }
        }
      },
      "mappings": {
        "PRE公司中文名称": {
          "dynamic": "false",
          "_source": {
            "enabled": true
          },
          "properties": {
            "name": {
              "index": "not_analyzed",
              "store": true,
              "type": "keyword",
              "normalizer": "my_normalizer"
            },
            "hcode": {
              "index": "not_analyzed",
              "store": true,
              "type": "keyword",
              "normalizer": "my_normalizer"
            },
            "pcode": {
              "index": "not_analyzed",
              "store": true,
              "type": "keyword",
              "normalizer": "my_normalizer"
            },
            "hupdatetime": {
              "index": "not_analyzed",
              "store": true,
              "type": "long"
            },
            "cluster_id": {
              "index": "not_analyzed",
              "store": true,
              "type": "integer"
            }
          }
        }
      }
    }
    

    初始化数据导入

    如果图库中已经有数据则按照下列说明对应操作。无数据则不用再手动同步,插件的事务同步机制会自动同步数据。

    创建好mapping之后重启图库。例如初始化导入‘PRE公司中文名称’标签下节点的数据,可以用以下过程:【进行索引数据强制事务提交:n.is_indices=1】【设置一个属性的原因就是为了单独触发事务更新机制,让数据同步到elasticsearch集群】

    CALL apoc.periodic.iterate('MATCH (n:PRE公司中文名称) RETURN n','WITH {n} AS n SET n.is_indices=1', {parallel:false,batchSize:1000}) YIELD  batches,total,timeTaken,committedOperations,failedOperations,failedBatches,retries,errorMessages,batch,operations RETURN batches,total,timeTaken,committedOperations,failedOperations,failedBatches,retries,errorMessages,batch,operations
    

    如果索引被删除了需要重新初始化导入,可以先删除‘is_indices’属性再执行一遍上述过程。【REMOVE【‘is_indices’】之后,重新强制提交事务】

    CALL apoc.periodic.iterate('MATCH (n:PRE公司中文名称) RETURN n','WITH {n} AS n REMOVE n.is_indices', {parallel:false,batchSize:1000}) YIELD  batches,total,timeTaken,committedOperations,failedOperations,failedBatches,retries,errorMessages,batch,operations RETURN batches,total,timeTaken,committedOperations,failedOperations,failedBatches,retries,errorMessages,batch,operations
    

    使用cypher存储过程在es中检索

    例如下面这个查询,看起来并不复杂数据量小并发不大的情况下响应速度也非常快。但是对应标签下数据量上千万之后性能就比较差了。【次查询实现返回前一百个公司聚簇】

    MATCH (n:PREClusterHeart公司) WITH n.cluster_id AS clusterId MATCH (m:PRE公司中文名称) WHERE m.cluster_id=clusterId RETURN clusterId AS master,COUNT(m) AS slaveCount,COLLECT(id(m)+'-'+m.name) AS slaves ORDER BY slaveCount DESC LIMIT 100
    

    使用es优化上述查询:

    "CALL apoc.es.query('https://localhost:9200','pre_org_cn_node','',null,{size:0,query:{bool:{}},aggs:{cluster_id:{terms:{field:'cluster_id',size:10,shard_size:100000,order:{_count:'DESC'}},aggs:{topHitsData:{top_hits:{size:100,_source:{includes:['name']}}}}},field_count:{cardinality:{precision_threshold:100000,field:'cluster_id'}}}}) yield value WITH value.aggregations.cluster_id.buckets AS buckets UNWIND buckets AS topHitsData RETURN topHitsData.key AS master,topHitsData.doc_count AS slaveCount,topHitsData.topHitsData.hits.hits AS slaves"
    }
    

    其它常用查询

    如果使用了中文标签,下列查询中GET请求与POST请求都不可以使用中文索引类型去查询【创建mapping时是可以支持中文的】,所以在使用GET请求时设置TYPE为_all,POST时TYPE为空即可。【所以上述提到不要有重名的索引】

    • 查看索引统计信息
    CALL apoc.es.stats('localhost:9200') YIELD value RETURN value
    CALL apoc.es.stats('localhost') YIELD value RETURN value
    
    • 通过节点ID查询公司名称
    CALL apoc.es.get('localhost','pre_org_cn_node','_all','15097731',null,null) yield value
    
    • 通过节点ID查询公司名称【设置需要返回的字段和不需要返回的字段】
    CALL apoc.es.get('localhost','pre_org_cn_node','_all','15097731',{_source_include:'name,pcode',_source_exclude:'description'},null) yield value
    CALL apoc.es.get('localhost','pre_org_cn_node','_all','15097731','_source_include=name&_source_exclude=description',null) yield value
    CALL apoc.es.get('localhost','pre_org_cn_node','_all','15097731',{_source_include:'name'},null) yield value
    CALL apoc.es.get('localhost:9200','pre_org_cn_node','_all','15097731',{_source_include:'name'},null) yield value
    
    • 使用_search接口搜索文档【随机返回一些doc】
    CALL apoc.es.query('localhost','pre_org_cn_node','',null,null) yield value
    
    • 通过name参数搜索/_search?q=name:?
    CALL apoc.es.query('localhost','pre_org_cn_node','','q=name:吉林白山航空发展股份有限公司',null) yield value
    
    • 通过name参数搜索【设置分页参数】/_search?q=name:get
    CALL apoc.es.query('localhost','pre_org_cn_node','','size=1&scroll=1m&_source=true&q=name:吉林白山航空发展股份有限公司',null) yield value
    
    • 使用elasticsearch-dsl查询数据
    CALL apoc.es.query('localhost','pre_org_cn_node','',null,{query: {match: {name: '吉林白山航空发展股份有限公司'}}}) yield value
    
    • 解析查询返回doc【返回hists中的节点数据】
    CALL apoc.es.query('localhost','pre_org_cn_node','',null,{query: {match: {name: '吉林白山航空发展股份有限公司'}}}) yield value with value.hits.hits AS hits WITH hits
    UNWIND hits AS hit
    RETURN hit._source AS nodeData
    
    • 解析查询返回doc【返回name】
    CALL apoc.es.get('localhost','pre_org_cn_node','_all','15097731',{_source_include:'name'},null) yield value with value._source.name AS name return name
    
    • 通过节点ID查询查询与当前节点名称相同的节点
    // 这个查询看起来复杂度不高,但是当数据库资源占用较多时也非常耗时基本都在秒级以上
    MATCH (n:PRE公司中文名称) WHERE ID(n)=" + idNNodeId + " WITH n
    MATCH (m:PRE公司中文名称) WHERE n<>m AND m.name=n.name RETURN ID(m) AS idM
    
    // 优化上述查询,在es中实现
    WITH 'https://localhost:9200' AS esUrl
    WITH 'pre_org_cn_node' AS indexName,esUrl
    CALL apoc.es.get(esUrl,indexName,'_all','10232180',null,null) YIELD value WITH value._source.name AS name,indexName,esUrl
    CALL apoc.es.query(esUrl,indexName,'',null,{query: {term: {name: name}}}) yield value with value.hits.hits AS hits
    UNWIND hits AS hit
    WITH hit._source.id AS nodeId
    MATCH (n:PRE公司中文名称) WHERE ID(n)<>10232180 AND ID(n)=TOINT(nodeId) RETURN n
    
    • 统计name字段并返回前10个结果
    CALL apoc.es.query('localhost','pre_org_cn_node','',null,{aggs: {field: {terms: {field: 'name',size: 10}}}}) yield value WITH value.aggregations.field.buckets AS aggregations RETURN aggregations
    
    • 统计name字段并返回前1个结果【并在图中展示这些节点】【使用节点ID到图中检索节点不要用名称,因为涉及到检索的大小写转换问题】
    WITH 'localhost' AS esUrl
    WITH 'pre_org_cn_node' AS indexName,esUrl
    CALL apoc.es.query(esUrl,indexName,'',null,{aggs: {field: {terms: {field: 'name',size: 1}}}}) yield value
    WITH value.aggregations.field.buckets AS aggregations,esUrl,indexName
    UNWIND aggregations AS keyCount
    WITH keyCount.key AS name,esUrl,indexName
    CALL apoc.es.query(esUrl,indexName,'','q=name:'+name,null) yield value WITH value.hits.hits AS hits
    UNWIND hits AS hit
    WITH hit._source.id AS nodeId
    MATCH (n:`PRE公司中文名称`) WHERE ID(n)=TOINT(nodeId) RETURN n
    
    • 使用with设置索引配置
    WITH 'https://localhost:9200' AS esUrl
    WITH 'pre_org_cn_node' AS indexName,esUrl
    CALL apoc.es.query(esUrl,indexName,'',null,{aggs: {field: {terms: {field: 'name',size: 1}}}}) yield value
    WITH value.aggregations.field.buckets AS aggregations,esUrl,indexName
    UNWIND aggregations AS keyCount
    WITH keyCount.key AS name,esUrl,indexName
    CALL apoc.es.query(esUrl,indexName,'','q=name:'+name,null) yield value WITH value.hits.hits AS hits
    UNWIND hits AS hit
    WITH hit._source.id AS nodeId
    MATCH (n:`PRE公司中文名称`) WHERE ID(n)=TOINT(nodeId) RETURN n
    
    • 使用unwind设置索引配置
    UNWIND [{esUrl:'https://localhost:9200',indexName:'pre_org_cn_node'}] AS configuration 
    WITH configuration.esUrl AS esUrl,configuration.indexName AS indexName
    CALL apoc.es.query(esUrl,indexName,'',null,{aggs: {field: {terms: {field: 'name',size: 1}}}}) yield value 
    WITH value.aggregations.field.buckets AS aggregations,esUrl,indexName
    UNWIND aggregations AS keyCount
    WITH keyCount.key AS name,esUrl,indexName
    CALL apoc.es.query(esUrl,indexName,'','q=name:'+name,null) yield value WITH value.hits.hits AS hits
    UNWIND hits AS hit
    WITH hit._source.id AS nodeId
    MATCH (n:`PRE公司中文名称`) WHERE ID(n)=TOINT(nodeId) RETURN n
    
    展开全文
  • 大学文献检索资料 DOC

    2009-11-28 10:35:24
    通过科技文献检索助于开拓知识面,改善知识结构。 4.通过科技文献检索可避免科研重复,加快科研工作的进程. 5.通过科技文献检索能加强科技交流,促进技术合作。 第三节 科技文献的特点及类型 1.什么是科技文献...
  • Lucene Sphinx 全文索引 对比

    千次阅读 2017-04-02 11:52:45
    全文检索功能很多系统中都有用到,但我有个疑问:到底是用数据库中提供的全文检索功能,还是选用如 Lucene 之类的东西来实现?我主要想知道,这两种方式什么区别?各自适用于什么样的场合?对中文的支持都怎么样?...

    全文检索功能很多系统中都有用到,但我有个疑问:到底是用数据库中提供的全文检索功能,还是选用如 Lucene 之类的东西来实现?我主要想知道,这两种方式有什么区别?各自适用于什么样的场合?对中文的支持都怎么样?效率呢?

     http://blog.csdn.net/lansetiankong12/article/details/50548197

     

    1.   1lucene(solr, elasticsearch 都是基于它) 

    检索时它对CPU和内存的需求很小, 建立索引时却不小,不过估计你每天重建索引的次数也不多,所以估计问题不大。

     

     

    2.   Lucene缺点

    性能较差

    使用Lucene有一定的挑战性。想要用好它的话,你需要时刻留心很多东西。而且它只是一个jar包,不支持分布式。

    4incrementalfetchlucene不支持从中间取索引。例如:用户取第十页,lucene需要把前面所有的内容都要检索出,然后所有的排序,过滤掉前面的然后返回。虽然说,这个从用户行为来说(因为大多数用户还是看前面的,不会跳着来),不是什么大问题。但是,这个毕竟可以解决。

    3.    Sphinx

    一个能够被各种语言(PHP/Python/Ruby/etc)方便调用的全文检索系统

    一般而言,Sphinx是一个独立的搜索引擎,意图为其他应用提供高速、低空间占用、高结果相关度的全文搜索功能。Sphinx可以非常容易的与SQL数据库和脚本语言集成。

     

    Sphinx是一个俄国人开发的搜索引擎,

    3.1.  Sphinx 跟 RDBMS (特别是MYSQL) 绑定的特别紧密

    3.1.  性能非常出色

    150万条记录一两分钟就索引完毕,2-4GB以内的文本检索速度不到0.1秒钟。ferret也望尘莫及,更不要说lucene了

     

    3.2.  和数据库集成性很好

    Sphinx通过配置文件可以自行读取数据库信息做索引,不依赖任何外部的应用程序,并且可以作为一个daemon进程启动,支持分布式检索,并发响应性能很好。因此很多过去使用ferret的人因为并发检索的问题都改用Sphinx了。

     

    3.3.  可以做MySQL的全文检索 

    MySQL的数据库引擎是可插拔的结构,Sphinx开发了一个SphinxSE数据库引擎,可以在编译MySQL的时候直接编译到MySQL里面去,这样的话,可以在数据库级别支持高性能的全文检索,那么你可以以如下SQL方式去全文检索了: 

    select * from xxxxwhere query='test;sort=attr_asc:group_id' AND ....; 

    很棒吧

     

    当前系统内置MySQL和PostgreSQL 数据库数据源的支持,也支持从标准输入读取特定格式的XML数据。通过修改源代码,用户可以自行增加新的数据源(例如:其他类型的DBMS的原生支持)。支持原生的mysql数据源,也支持xml数据。

     

    搜索API支持PHP、Python、Perl、Rudy和Java,并且也可以用作MySQL存储引擎。搜索API非常简单,可以在若干个小时之内移植到新的语言上。

     

    Sphinx建索引速度是最快的,比Lucene快9倍以上。因此,Sphinx非常适合做准实时搜索引擎。

    . sphinx用c++编写,调用native api,s

    Sphinx支持高速建立索引(可达10MB/秒,而Lucene建立索引的速度是1.8MB/秒)

    高性能搜索(在2-4 GB的文本上搜索,平均0.1秒内获得结果)

    高扩展性(实测最高可对100GB的文本建立索引,单一索引可包含1亿条记录)

    支持分布式检索

    支持基于短语和基于统计的复合结果排序机制

    支持任意数量的文件字段(数值属性或全文检索属性)

    支持不同的搜索模式(“完全匹配”,“短语匹配”和“任一匹配”)

    支持作为Mysql的存储引擎(可以只改变sql就能实现全文搜索)

    coreseek就是基于sphinx的实现

     

    对于中文搜索,国内有coreseek和sphinx-for-chinese两个版本,内部使用了mmseg这个分词器。用户可以自定义分词库。

     

    sphinx-for-chinese是一款专门为中文优化的全文搜索软件,在sphinx的基础上添加了中文分词模块,极大的提高了中文搜索的性能和效果

     

     

    ·        高速的建立索引(在当代CPU上,峰值性能可达到10MB/秒);

    ·        高性能的搜索(在2–4GB的文本数据上,平均每次检索响应时间小于0.1秒);

    ·        可处理海量数据(目前已知可以处理超过100GB的文本数据,在单一CPU的系统上可处理100M文档);

    ·        提供了优秀的相关度算法,基于短语相似度和统计(BM25)的复合Ranking方法;

    ·        支持分布式搜索;

    ·        提供文件的摘录生成;

    ·        可作为MySQL的存储引擎提供搜索服务;

    ·        支持布尔、短语、词语相似度等多种检索模式;

    ·        文档支持多个全文检索字段(最大不超过32个);

    ·        文档支持多个额外的属性信息(例如:分组信息,时间戳等);

    ·        停止词查询;

    ·        支持单一字节编码和UTF-8编码;

    ·        原生的MySQL支持(同时支持MyISAM和InnoDB);

    ·        原生的PostgreSQL支持.

     

     

    扩展性: 我对它了解的不多。但是很容易把一份索引COPY到多个服务器上,然后再跑多个搜索进程。  从其他人那里了解的情况是:在高压高并发下,单极表现就足够好了!所以没必要考虑把它做成分布式。。

     

    4.   Sphinx缺点

    有一点比较重要: sphinx不支持 live index update. 支持的话也非常有限。

    2. sphinx的索引是几乎静态的,(不能动态添加,删除新item),solr是动态索引,可以实时修改添加.要做到这点,需要加锁, 这是"慢"的最根本的原因

     

    5.  ElasticSearch

    分布式Lucene解决方案的核心是:  数据库需要水平分区的。(sharded, 词条见:shard  )  同时,还要使用 HTTP 和JSON 的形式来做为API。这样的优势是:不论什么语言,都可以轻易的调用它。 


    这就是我建立ElasticSearch的原因。  它用有先进的分布式模型, 本地语言是JSON, 还提供了很多查询特性。 这些都使用JSON形式的DSL来访问。 

    Solr 也是一个通过HTTP访问的检索/查询解决方案,但是我觉得ElasticSearch 提供了更好的分布式模型,也更容易使用(尽管目前看来, ElasticSearch还缺少某些检索特性,但是在不远的将来,我保证,会把Compass所有的特性都移植到ElasticSearch中去) 

    当然了,除了更好的分布式模型,ElasticSearch 还提供了很多其他的特性。 因为它的诞生就是基于 分布式的理念(built with cloud in mind),你可以试一下 站点中的特性里面所列举的特性。

     

    6.   solr

    支持分布式。 Solr 是基于Lucene 的

    Solr 可以检索 WORD, PDF。 Sphinx不行 

    Sphinx中,所有的document id 必须是 unique , unsigned, non-zero 整数(估计是用C语言的名词来解释)。Solr的很多操作,甚至不需要unique key。 而且unique key 可以是整数,也可以是字符串。

    Solr 支持fieldcollapsing 来避免相似搜索结果的重复性。 Sphinx没这个功能。 

    Sphinx只是查询documentid, 而solr则可以查询出整个的document. 

    7.  //中文全文检索

    不支持中文全文检索,但是支持英文全文检索,可以将“中文全文检索”转变为“英文全文检索”,然后再变回“中文全文检索”。那么中文又如何转换成英文呢?思路可以是:中文全文检索→拼音全文检索→中文全文检索。所以转换的思路如图1所示。

    中文字词存在同音现象,重码问题要解决。

     

     

    8.  /比较

    没有人推荐solr吗?基于lucence的企业级搜索,虽然也是java,但提高xml,json等http服务,php操作也很方便的。

    lucene功能强大,和消息队列结合会很好,唯一的缺点就是索引难维护,特别是多个索引的情况下。

    sphinx不需要太注重索引维护,但是它的缺点就是不太能实时的更新索引,支持的功能没有LUCENE强大,但是足够一个中小型网站使用。

    sphinx相比lucence,配置简单,易用,功能没有lucencename完善和强大。

    sphinx虽然简陋,但性能好几倍

    lucene可以实时增删索引,而sphinx只能通过定时任务实现,我不知道现在新版的实现没。反正这个是硬伤,速度再快也决定了它与实时性要求较高的web应用相去甚远

    大型网站除非有自己的搜索研发团队,否则不会使用sphinx,sphinx的扩展性很差,分词就是一难题,要么使用sphxin_for_chinese,但是这个玩意N年不更新了

     

    9.   结论: lucene+sphinx协同使用来得到更好的搜索结果。

    10.         参考:

     让MySQL支持中文全文检索 - 独家评论 - 中国软件网-中国企业级选型门户.htm

    Sphinx(狮身人面)比lucene还牛的搜索引擎 - minothing的专栏 - 博客频道 - CSDN.NET.htm

     

    [原创]使用postgreSQL+bamboo搭建比lucene方便N倍的全文搜索第二部分

    主流全文索引工具的比较( Lucene, Sphinx, solr, elastic search) - sg552 - ITeye技术网站.htm

    lucene缺点汇总_inJava_百度空间.htm

    【转】Sphinx在windows下安装使用[支持中文全文检索] - 真爱无悔 - 博客园.htm

    (Lucene讲的详细,ati注)全文检索系统与Lucene简介 - 水上漂的专栏 - 博客频道 - CSDN.Net.htm


    参考:

    http://www.mudbest.com/sphinx%E5%9C%A8windows%E4%B8%8B%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8%E6%94%AF%E6%8C%81%E4%B8%AD%E6%96%87%E5%85%A8%E6%96%87%E6%A3%80%E7%B4%A2/

    http://www.cnblogs.com/ainiaa/archive/2010/12/21/1912459.html

    http://www.cnblogs.com/ainiaa/archive/2010/12/21/1912459.html

    http://blog.csdn.net/whohow123/article/details/9849873

    展开全文
  • 主要有以下几种方法: 1. 根据文章出处,去一些较大图书馆查找原文。 2. 如果学校或单位有CNKI,维普,万方的话,就比较好办,中文文献一般都可以搞定,把关键词、期刊名称、卷,期、年等信息输入即可检索到。 3. ...
  • Apache Solr 介绍 Solr 是什么? ... Solr 是一个开源的企业级搜索服务器,底层使用... Solr 主要特性:强大的全文检索功能,高亮显示检索结果,动态集群,数据库接口和电子文档(Word ,PDF 等)的处理。而且
  • Apache Solr 介绍 Solr 是什么?  Solr 是一个开源的企业级搜索服务器... Solr 主要特性:强大的全文检索功能,高亮显示检索结果,动态集群,数据库接口和电子文档(Word ,PDF 等)的处理。而且Solr 具有高...
  • MYSQL中文手册

    2013-03-11 21:21:34
    1.4.2. MySQL的的主要特性 1.4.3. MySQL稳定性 1.4.4. MySQL表最大能达到多少 1.4.5. 2000年兼容性 1.5. MaxDB数据库管理系统概述 1.5.1. 什么是MaxDB? 1.5.2. MaxDB的历史 1.5.3. MaxDB的特性 1.5.4. 许可...
  • EndNote 有着易用的界面和强大的文献搜索功能,对中文也支持良好,是科研工作者不可多得的好助手,无论是文献的检索、管理、文献全文的自动获取,还是论文写作过程中的文献引用插入、SCI 期刊模板等方面,均可为用户...
  • 1.4.2. MySQL的的主要特性 1.4.3. MySQL稳定性 1.4.4. MySQL表最大能达到多少 1.4.5. 2000年兼容性 1.5. MaxDB数据库管理系统概述 1.5.1. 什么是MaxDB? 1.5.2. MaxDB的历史 1.5.3. MaxDB的特性 1.5.4. 许可和支持 ...
  • 1.4.2. MySQL的的主要特性 1.4.3. MySQL稳定性 1.4.4. MySQL表最大能达到多少 1.4.5. 2000年兼容性 1.5. MaxDB数据库管理系统概述 1.5.1. 什么是MaxDB? 1.5.2. MaxDB的历史 1.5.3. MaxDB的特性 1.5.4. 许可和支持 ...
  • Java 1.6 API 中文 New

    2013-10-26 14:08:22
    支持全文检索,在线即时查询。 里面列出了,Java的所有类及其使用方法! Java SE Platform 软件包: java.applet 提供创建 applet 所必需的类和 applet 用来与其 applet 上下文通信的类。 java.awt 包含用于创建用户...
  • [Oracle.11g权威指南(第2版)].谷长勇.扫描版.pdf

    千次下载 热门讨论 2013-06-23 21:16:09
    1.2 数据库主要特征 2 1.3 数据库构成 3 1.4 数据库管理系统 3 1.5 关系数据库 4 1.6 本章小结 8 第2章 Oracle 11g概述 9 本章主要介绍了数据库的基础知识、Oracle数据库的特点、发展历史及Oracle的最新数据库版本11...
  •  由于要面向所有主要数据库管理系统(DBMS),我不得不把针对具体DBMS的内容一再压缩。  为了简化SQL的讲解,我必须(尽可能)只写各种主要的DBMS通用的SQL语句。这要求我不得不舍弃一些更好的、针对具体DBMS的...
  • 书中继承了《sql必知必会》的优点,在精练然而透彻地阐述了数据库基础理论之后,紧贴实战需要,很快转向数据检索,逐步深入各种复杂的内容,包括联结的使用、子查询、基于全文本的搜索等等。对于每个知识点,都给出...
  • 是国外高质量学位论文全文数据库主要收录了来自欧美国家2000余所知名大学的优秀博硕士论文,目前中国集团可以共享的论文已经达到459026篇,涉及文、理、工、农、医等多个领域,是学术研究中十分重要的信息资源。...
  • 英文拼写检查库 、 wwsearch是企业微信后台自研的全文检索引擎、CHAMELEON:深度学习新闻推荐系统元架构 、 8篇论文梳理BERT相关模型进展与反思、DocSearch:免费文档搜索引擎、 LIDA:轻量交互式对话标注工具 、...
  • javapms门户网站源码

    2014-08-07 17:24:08
    系统支持强大的中文检索组件,可以对内容进行高效的全文检索,支持所有流行文档格式的检索,能够自动提取文本正文、生成内容摘要,能够自定义检索结果展现形式,以满足不同行业的特殊要求,构建细分领域内的垂直搜索...
  • COLA :根据我的了解来看,很多公司的项目都是基于 COLA 进行开发的,相比于其他快速开发脚手架,COLA 并不提供什么已经开发好的功能,它提供的主要是一个干净的架构,然后你可以在此基础上进行开发。通过一行命令就...
  • asp.net知识库

    2015-06-18 08:45:45
    如何使数据库中的表更弹性,更易于扩展 存储过程——天使还是魔鬼 如何获取MSSQLServer,Oracel,Access中的数据字典信息 C#中利用GetOleDbSchemaTable获取数据库内表信息[原创] 如何解决ACCESS中SELECT TOP语句竟然...
  • (2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户可以在终端上直接地使用它,但是它的主要作用是供程序使用的。本规范尝试满足...
  • JAVA上百实例源码以及开源项目

    千次下载 热门讨论 2016-01-03 17:37:40
    (2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户可以在终端上直接地使用它,但是它的主要作用是供程序使用的。本规范尝试满足...
  • java开源包1

    千次下载 热门讨论 2013-06-28 09:14:34
    MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...
  • java开源包12

    热门讨论 2013-06-28 10:14:45
    MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...
  • Java资源包01

    2016-08-31 09:16:25
    MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...

空空如也

空空如也

1 2
收藏数 40
精华内容 16
关键字:

中文全文检索数据库主要有