elasticlunr.js 最新版本v0.6.7发布啦

elasticlunr.js 最新版本v0.6.7发布啦

分类:NLP

本小编写的第一个有点实用价值的开源类库elasticlunr.js刚刚发布了最新的版本v0.6.7, 该项目是在lunr.js的基础上进行大幅度改进生成的。希望各位帮忙做code review,本人并不熟悉javascript, 还有,如果方便的话希望给位帮忙在github上点赞,嘿嘿,您的一个赞,是我继续努力改进该项目的最大动力来源。

本项目的主页:elasticlunr.js 项目代码:elasticlunr.js code 项目文档: elasticlunr.js doc 项目的npm发布地址: elasticlunr.js npm 项目在线演示地址: elasticlunr.js demo

目前,与lunr相比,比较大的改动主要有: 1. Query-Time Boosting, 目前elasticlunr支持查询时的权重调整,可以方便的根据不同的应用场景调整不同field的权重,不用在建立索引的时候直接写入不可以调整的field weight. 2. More Rational Scoring Mechanism, 目前elasticlunr.js采用和elasticsearch 以及 lucence完全一直的文档评分准则,比lunr.js的评分更加准确、客观。目前采用的评分准则在通用的tf idf tf*idf 还做了field length normalization, field length normalization 有点像BM25模型,如果一个field太长,会导致tf比较大,做了field length normalization以后能够对长field的tf做一个penality;同时,elasticlunr.js还做了coord normalization 和 query normalization, 将query-time boosting 信息enroll 到了query normalization中。关于Elasticlurn和elasticsearch是如何具体的做scoring的,请参考我的文章Elasticsearch scoring detailed explanation. 3. Field-Search, 用户建立索引的时候,可以指定文档的哪些field需要建立到索引中,同时,用户在查询的时候可以指定要查找哪些field, 可以指定给每个field 多少权重,这样能够实现非常灵活的查询。 4. Boolean Model, 用户查询的时候可以指定全局的boolean model, 也可以指定某个field的boolean model, field boolean model 会覆盖全局的boolean model, 这样用户就可以指定是否需要在某个field中包含全部的query tokens. 5. Combined Boolean Model, TF/IDF Model and the Vector Space Model, 目前elasticlunr整合了boolean model, tf/idf model 和 vector space model 进行文档ranking分数的计算,这个计算使得文档的ranking准确性更好。文档分数计算请见:Elasticsearch scoring detailed explanation. 未来还会包括其他的ranking model, 例如BM25 Model. 6. Fast, elasticlunr.js在计算文档相似度的时候不用计算query 的向量和文档的向量,没有采用vector space model, 而是采用计算每个query token在出现文档中的score, 然后把每个query token的score累加起来,最后进行query normalization, 所以在进行query的时候计算速度比较快。 7. Small Index Size, elasticlunr.js没有存储token corpus, 因为没有必要计算文档向量,这样可以节省一部分存储大小;同时,elasticlunr.js用户可以设置是否存储json格式的文档,如果用户比较关心index的大小,可以设置为不存储json格式的documents;最重要的部分是,elasticlunr.js 优化了index的存储信息,使得index的大小可以降低到原来的一般左右。

应用示例建立索引

如果用户不设置是否存储文档,默认为存储,这样用户可以用JSON文档生成摘要:

.addField(‘title’);this.addField(‘body’);this.setRef(‘id’);});

用户可以设置不存储JSON文档:

var index = elasticlunr();index.addField(‘title’);index.addField(‘body’);index.setRef(‘id’);index.saveDocument(false);索引文档

Adding documents to the index is as simple as:

直接可以索引JSON格式的文档

var doc1 = {“id”: 1,”title”: “Oracle released its latest database Oracle 12g”,”body”: “Yestaday Oracle has released its new database Oracle 12g, this would make more money for this company and lead to a nice profit report of annual year.”}var doc2 = {“id”: 2,”title”: “Oracle released its profit report of 2015″,”body”: “As expected, Oracle released its profit report of 2015, during the good sales of database and hardware, Oracle’s profit of 2015 reached 12.5 Billion.”}index.addDoc(doc1);index.addDoc(doc2);简单文档检索index.search(“Oracle database profit”);

检索结果:

[{“ref”: 1,”score”: 0.5376053707962494},{“ref”: 2,”score”: 0.5237481076838757}]

因为elasticlunr.js已经有非常复杂的、合理的评分系统,所以大部分情况下用户只需要使用最简单的查询就可以满足需要,当然如果用户比较熟悉检索原理的话,也可通过配置实现更加复杂的、针对不同应用情况的检索。

field search && configuration

用户可以指定查询哪些field, 给每个field多少权重,,在每个field中使用哪个boolean model进行检索。

index.search(“Oracle database profit”, {fields: {title: {boost: 2},body: {boost: 1}},bool: “OR”});

上面的查询例子通过设定全局的bool model表示在每个field中,都采用这个bool model, 如果在某个field中指定了其他的bool model,那么field的bool model 会覆盖全局的bool model, 例如:

index.search(“Oracle database profit”, {fields: {title: {boost: 2, bool: “AND”},body: {boost: 1}},bool: “OR”});为什么你需要elasticlunr.js?有一种旅行,叫单车旅行。它没有奢侈准备,

elasticlunr.js 最新版本v0.6.7发布啦

相关文章:

你感兴趣的文章:

标签云: