关于文章 搜索

jieba search whoosh 分词 搜索

博客使用whoosh+jieba作搜索

whoosh作引擎,jieba作分词,实现搜索功能

博客一直没有搜索,本来想用es ,但是想用更硬核一点的所以选用了whoosh ,whoosh是纯py编写的

上代码

单例模式初始化一次whoosh

更新后注销调对象

唯一难受的是 博客从30m/上下的内存占用 彪升到226m!!!!!!!!!!

网上的whoosh 都是贼简单的demo

import os
from jieba.analyse import ChineseAnalyzer
from whoosh.qparser import MultifieldParser
from services import Singleton
from logic.articleDao import articleDao
from whoosh.index import create_in
from whoosh.fields import Schema,ID,TEXT
ana=ChineseAnalyzer()
class Search(metaclass=Singleton):
    def __init__(self):
        self.list = articleDao.listAllNoPage()
        schema = Schema(
            id=ID(stored=True, analyzer=ana),
            title=TEXT(stored=True, analyzer=ana),
            content=TEXT(stored=True, analyzer=ana),
            keyword=TEXT(stored=True, analyzer=ana),
            desc=TEXT(stored=True, analyzer=ana),)
        if not os.path.exists("index"):
            os.mkdir("index")
        ix= create_in("index",schema)
        writer = ix.writer()
        for art in self.list:
            writer.add_document(
                            id=str(art.id),
                           title=art.title,
                           content=art.content,
                           keyword=art.keyword,
                           desc=art.desc)
        writer.commit()
        self.ix= ix

    def search(self,keyword):
        searcher = self.ix.searcher()
        query = MultifieldParser(["content","title","desc","keyword"],schema=self.ix.schema).parse(keyword)
        res=searcher.search(query,limit=len(self.list))
        result = []
        for r in res:
            result.append(r.get("id"))
        searcher.close()
        return result

    @classmethod
    def clear(cls):
        cls._instances = {}
arangodb 图数据库 搜索 智能推荐

ArangoDB图数据库应用探索

arangodb数据库图搜索的应用

title: ArangoDB 图数据库 应用探索

ArangoDB 图数据库 应用探索

Not Only SQL

ArangoDB

  • 图数据库

  • K/V数据库

  • 文档数据库

  • Foxx(V8引擎)

ArangoDB 图数据库场景

行为分析 社会关系 风险控制 人脉管理

现实应用

  • 智能推荐
  • 广告投递
  • 婚恋交友
  • 猎头挖人
  • 公安破案
  • 金融风控

App应用商店关系分析

  • 用户 -安装-> APP
  • 用户 -卸载-> APP
  • APP -属于-> 公司
  • APP -属于-> 分类

App应用商店关系分析

用户集合

生成五千个随机用户数据

for user in 1..5000
    INSERT {
            "date":(DATE_NOW()+FLOOR(RAND()*100)),
            "info":CONCAT("附加信息",user)
            } IN users return NEW

  {
    "_key": "40502",
    "_id": "users/40502",
    "_rev": "_WfKeWT---C",
    "date": 1520739311982,
    "info": "附加信息3362"
  }

App应用商店关系分析

app集合

生成一万个随机APP数据

for app IN 1..10000
    INSERT {"name":CONCAT("app",app)}
    INTO apps

  {
    "_key": "64203",
    "_id": "apps/64203",
    "_rev": "_WfKkWO2-_v",
    "name": "app9922"
  }

App应用商店关系分析

分类集合

生成六个随机分类

for doc IN 1..6
    INSERT {
        "name":CONCAT("classify",doc)
            } INTO classify
    RETURN NEW


{
"_key": "64881",
"_id": "classify/64881",
"_rev": "_WfKpDZW--_",
"name": "classify2"
}

App应用商店关系分析

公司集合

生成三百个随机公司

for doc IN 1..300
    INSERT {
        "name":CONCAT("company",doc)
            } INTO company
    RETURN NEW

{
    "_key": "65022",
    "_id": "company/65022",
    "_rev": "_WfKq8fW---",
    "name": "company1"
}

App应用商店关系生成

用户安装

随机用户共三万次随机安装

FOR doc IN 1..30000
    LET edge = {_from:(FOR user IN users
                        SORT RAND()
                        LIMIT 1
                        RETURN user)[0]._id,
            _to:(FOR app IN apps
                        SORT RAND()
                        LIMIT 1
                        RETURN app)[0]._id,
            "info":CONCAT("附加信息",doc)}
    INSERT edge INTO installs
    RETURN NEW

{
    "_key": "190139",
    "_id": "installs/190139",
    "_from": "users/24833",
    "_to": "apps/50991",
    "_rev": "_WfLNQbm---",
    "info": "附加信息1"
}

App应用商店关系生成

用户卸载

随机用户共三万次随机卸载

FOR doc IN 1..30000
    LET edge = {_from:(FOR user IN users
                        SORT RAND()
                        LIMIT 1
                        RETURN user)[0]._id,
            _to:(FOR app IN apps
                        SORT RAND()
                        LIMIT 1
                        RETURN app)[0]._id,
            "info":CONCAT("附加信息",doc)}
    INSERT edge INTO unstalls
    RETURN NEW
 {
    "_key": "190139",
    "_id": "unstall/190139",
    "_from": "users/24833",
    "_to": "apps/50991",
    "_rev": "_WfLNQbm---",
    "info": "附加信息1"
}  

App应用商店关系生成

APP属于某公司

FOR app IN apps
    LET edge = {_from:app._id,
            _to:(FOR com IN company
                        SORT RAND()
                        LIMIT 1
                        RETURN com)[0]._id,
            "info":CONCAT("附加信息",app._key)}
    INSERT edge INTO belongtocompany
    RETURN NEW

 {
    "_key": "190139",
    "_id": "unstall/190139",
    "_from": "users/24833",
    "_to": "apps/50991",
    "_rev": "_WfLNQbm---",
    "info": "附加信息1"
}  

App应用商店关系生成

APP属于某分类

FOR app IN apps
    LET edge = {_from:app._id,
            _to:(FOR class IN classify
                        SORT RAND()
                        LIMIT 1
                        RETURN class)[0]._id,
            "info":CONCAT("附加信息",app._key)}
    INSERT edge INTO belongtoclassify
    RETURN NEW

APP属于某分类

APP属于某分类

App应用商店关系生成分析(开发环境)

二级

测试图

App应用商店关系生成分析(开发环境)

三级

测试图

App应用商店关系

动态推荐APP

与用户相关分类APP,根据安装最多排序

//卸载的APP
LET uninstallapp=( FOR app IN unstalls
    FILTER app._from == @user
    return app)

//安装的APP
LET installapp = ( FOR app IN installs
    FILTER app._from ==@user
    return app)

//根据用户安装情况关联未安装的app并且根据安装量排序
FOR v,e,p IN 1..3 OUTBOUND @user installs ,ANY belongtoclassify
FILTER v NOT IN uninstallapp
FILTER v NOT IN installapp
FILTER v IN apps
    FILTER v._id IN installs[*]._to
    COLLECT to = v.id
        WITH COUNT INTO size
        SORT size DESC
        LIMIT 10
        RETURN {
                "app":to,
                "size":size
                }

App应用商店关系生成

动态推荐某公司

安装量最多

FOR coll IN  belongtocompany
    FOR app IN apps
        FILTER app._id == coll._from
        FOR install IN installs
            FILTER coll._from == install._to 
            COLLECT appcom = coll._to
                WITH COUNT INTO installsize
                SORT installsize DESC
RETURN {
        size:installsize,
        app:appcom}

App应用商店关系生成

动态推荐分类

用户安装app关联分类

FOR classedge IN  belongtoclassify
    FOR app IN apps
        FILTER app._id == classedge._from
        FOR class IN classify
            FILTER class._id == classedge._to 
            COLLECT classifycount = classedge._to
                WITH COUNT INTO installsize
                SORT installsize DESC
RETURN {classify:classifycount,
        size:installsize}

ArangoDB 其他应用体验

Foxx

const createRouter = require('@arangodb/foxx/router');
const indexRouter = createRouter();
indexRouter.all('/', function (req, res) {
  res.redirect('index.html');
});
module.context.use(indexRouter);
办公 搜索 效率

一些存活的搜索引擎

好用的搜索引擎

一些存活的搜索引擎

Rambler.ru

Rambler.ru 是俄罗斯门户网站,也是俄罗斯三大门户网站之一 。 重点是无需科学上网。这个网站的搜索引擎是谷歌提供支持。网页搜索右下角显示由谷歌技术驱动。

https://nova.rambler.ru/

Bird.so

Bird.so 关于技术问题的搜索结果来自 google 搜索、雅虎搜索、必应搜索的聚合;经过测试,优先展示 google 搜索结果

http://bird.so/

yahoo

不用多解释,昔日巨头

https://sg.search.yahoo.com

mezw

经过几个简单的关键字搜索,发现 MEZW 搜索结果与 Google 并无太大差异。优点:国内正常访问,界面简洁

https://so.mezw.com/

avira

Avira 是世界著名的杀毒软件,中文名:小红伞,来自德国。 搜索引擎基于 ASK

https://search.avira.com/

Ecosia

Ecosia 是一个基于 Bing 和 Yahoo 的绿色搜索引擎,通过自身算法优化整合 Bing 和 Yahoo 的搜索结果,展示最优的结果

https://www.ecosia.org/