MyException - 我的异常网
当前位置:我的异常网» JavaScript » elasticlunr.js 最新版本v0.6.7公布啦

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

www.MyException.Cn  网友分享于:2015-08-26  浏览:0次
elasticlunr.js 最新版本v0.6.7发布啦

本小编写的第一个有点实用价值的开源类库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文档生成摘要:

var index = elasticlunr(function () {
    this.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?

  1. 在很多情况下,你可能想让自己的一些文档能够实现检索的功能,但是又不想提供太复杂服务器环境配置,这时候你可以完全用elasticlunr.js建立文档索引,然后在浏览器中使用搜索功能,你只需要在服务器上提供简单的apache静态网页服务即可。

  2. 很多时候用户可能在受限的网络环境下,不能总是访问网络或者访问网络的成本比较大,例如移动设备,这个时候如果能共提供离线的文档并支持搜索功能,对于用户来说是非常友好的。例如,某个模块的文档,用户往往在下载模块的时候就已经包含文档了,如果用户在本地使用这些文档的话,提供搜索功能是非常有用的。

版权声明:本文为博主原创文章,未经博主允许不得转载。

文章评论

旅行,写作,编程
旅行,写作,编程
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
 程序员的样子
程序员的样子
老程序员的下场
老程序员的下场
如何成为一名黑客
如何成为一名黑客
中美印日四国程序员比较
中美印日四国程序员比较
那些争议最大的编程观点
那些争议最大的编程观点
程序员都该阅读的书
程序员都该阅读的书
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
漫画:程序员的工作
漫画:程序员的工作
鲜为人知的编程真相
鲜为人知的编程真相
那些性感的让人尖叫的程序员
那些性感的让人尖叫的程序员
总结2014中国互联网十大段子
总结2014中国互联网十大段子
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
程序员的鄙视链
程序员的鄙视链
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
程序员和编码员之间的区别
程序员和编码员之间的区别
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
代码女神横空出世
代码女神横空出世
编程语言是女人
编程语言是女人
为什么程序员都是夜猫子
为什么程序员都是夜猫子
2013年中国软件开发者薪资调查报告
2013年中国软件开发者薪资调查报告
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
2013年美国开发者薪资调查报告
2013年美国开发者薪资调查报告
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
Java程序员必看电影
Java程序员必看电影
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
我是如何打败拖延症的
我是如何打败拖延症的
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
Google伦敦新总部 犹如星级庄园
Google伦敦新总部 犹如星级庄园
程序员应该关注的一些事儿
程序员应该关注的一些事儿
10个调试和排错的小建议
10个调试和排错的小建议
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
我的丈夫是个程序员
我的丈夫是个程序员
程序员必看的十大电影
程序员必看的十大电影
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有