在 Emacs 中集成 Recoll 全文搜索

*/-->

在 Emacs 中集成 Recoll 全文搜索

目录

  • 1. 需求
  • 2. 解决办法

1 需求

时间一长,平常收集的资料就多了,于是使用了 recoll 全文搜索,但是在Emacs 中工作时
间多,搜索要在 Emacs 和 Recoll 图形界面中来回切换,很不方便。而且,如果本地文件
中找不到,要用搜索引擎到网上搜索的话就更麻烦了,于是想能不能把这需要整合一下,平
时找东西直接开 Recoll 搜索,如果没有的话可以一键切到 Google 搜索结果。

2 解决办法

  1. 原来的办法

    这是在网上搜索到的办法,最大的问题就是你看不到摘要,只有在 minibuffer 中看文件名
    猜其中有啥,如果不是你想要的东西,还得再输入搜索字符串,重来一回,比在 recoll
    图形界面中还要麻烦。

    (defun counsel-recoll-function (string &rest _unused)
      "Issue recallq for STRING."
      (if (< (length string) 3)
          (counsel-more-chars 3)
        (counsel--async-command
         (format "recollq -b ‘%s‘" string))
        nil))
    
    (defun counsel-recoll (&optional initial-input)
      "Search for a string in the recoll database.
    You‘ll be given a list of files that match.
    Selecting a file will launch `swiper‘ for that file.
    INITIAL-INPUT can be given as the initial minibuffer input."
      (interactive)
      (ivy-read "recoll: " ‘counsel-recoll-function
                :initial-input initial-input
                :dynamic-collection t
                :history ‘counsel-git-grep-history
                :action (lambda (x)
                          (when (string-match "file://\\(.*\\)\\‘" x)
                            (let ((file-name (match-string 1 x)))
                              (find-file file-name)
                              (unless (string-match "pdf$" x)
                                (swiper ivy-text)))))))
    
  2. 我的解决办法

    使用 "recoll -t -A query" 输出查询结果到 Emacs 缓冲中,包含摘要等内容,然后构
    建成 html 文档,再用 `eww-display-html‘ 来显示缓冲。

    (defvar recoll-to-html-temmplate "~/Templates/recoll-to-html-template.html")
    (defun recoll-to-html(query)
      "Use recoll search local file as eww, require `org‘,`eww‘,and recoll installed and indexed.
    You can press `n‘ to call `eww-next-url‘ google the QUERY."
      (interactive "sSearch Words:")
      (require ‘org)
      (require ‘eww)
      (let ((source nil)
            (google-search-url (format "http://www.google.com/search?q=%s" (url-hexify-string query)))
            (content-tail-marker nil)
            (buffer (get-buffer-create "*recoll*")))
        (with-current-buffer buffer
          (setq inhibit-read-only t )
          (display-buffer buffer)
          (erase-buffer)
          ;; insert template and goto the body insert point
          (insert-file-contents (expand-file-name recoll-to-html-temmplate))
          (if (not  (re-search-forward "<body>\n</body>" nil t))
              (message "Invalid html template")
            )
          (goto-char (- (point) 7))
          (setq marker-beg (point))
          ;; insert the search result
          (insert
           (shell-command-to-string
            (format "recoll -t -A ‘%s‘" query)))
          (setq content-tail-marker (point))
          ;; change the keyword display color
          (goto-char (point-min))
          (while (re-search-forward "\nABSTRACT\n\\(.+\\)\n/ABSTRACT" nil t)
            (save-restriction
              (narrow-to-region (match-beginning 1) (match-end 1))
              (goto-char (point-min))
              (replace-string query  (concat  "<span style=\"color:#F00\">" query "</span>" ))
              )
            )
    
          ;; insert paragraph tags
          (narrow-to-region marker-beg (point-max))
          (goto-char (point-min))
          (insert "<h1>")
          (goto-char (point-min))
          (forward-line 2)
          (insert "</h1>" "\n<p>Search with Google:  <a href=\"" google-search-url "\">" query "</a></p>" "\n<p>")
          (goto-char (point-min))
          (replace-string "\nABSTRACT\n" "</p>\n<p>")
          (goto-char (point-min))
          (replace-string "\n/ABSTRACT\n" "</p>\n<p>")
          (goto-char (point-min))
          (replace-string "\n/ABSTRACT" "</p>\n<p>")
          (goto-char (point-max))
          (insert "</p>")
          (goto-char (point-min))
          (while (re-search-forward "bytes\n\\([\n]+\\)" nil t)
            (delete-region (match-beginning 1) (match-end 1))
            )
          ;; construct html url href
          (goto-char (point-min))
          (while (re-search-forward "\\[\\(.*\\)\\] \\[\\(.*\\)\\]" nil t)
            (let ((match-len (length (match-string 0)))
                  (esc-str (org-link-escape (match-string 1)))
                  (display-str  (match-string 2))
                  (marker-max (point))
                  )
              (delete-region (- marker-max match-len) marker-max)
              (insert "<a href=\"" esc-str "\">" display-str "</a>")
              )
            )
          (goto-char (point-max))
          (insert "\n<p>Search with Google:  <a href=\"" google-search-url "\">" query "</a></p>")
          (widen)
          (setq source (buffer-string))
          ;; display as html by eww
          (goto-char (point-min))
          (eww-display-html ‘utf-8 nil nil (point-min) buffer)
          (linum-mode t)
          (read-only-mode t)
          (eww-mode)
          )
        (with-current-buffer buffer
          (plist-put eww-data :url "Recoll") ;;here any string make `eww-next-url‘ work
          (plist-put eww-data :source source) ;; used for debug
          (plist-put eww-data :next google-search-url) ;; you can press `n‘ google the query
          (plist-put eww-data :title "RECOLL SEARCH RESULTS")
          (eww-update-header-line-format)
          (let ((old-data eww-data))
            (eww-save-history)
            (setq eww-history-position 0)
            (dolist (elem ‘(:source :url :title :next ))
              (plist-put eww-data elem (plist-get old-data elem)))
            (run-hooks ‘eww-after-render-hook)))
        ))
    

    但有个问题就是回退的时候,退不到我们的索引页面,原因是 `eww-follow-link‘ 中
    检查了访问 url 的构成,只有同一个页面的才会调用 `eww-save-history‘,我不知道
    作者是怎么考虑的,反正我给加个补丁,不管到什么 url 都调用 `eww-save-history‘
    保存当前页面。

    第二是他可能会使用外部浏览器打开页面。其实,Emacs 支持打开的页面已经完全可以
    满足我的需要了,于是将 `browse-url-browser-function‘ 设置为 `eww-browse-url‘。

    (setq browse-url-browser-function ‘eww-browse-url)
    (setq shr-external-browser (lambda (url &rest args) (apply ‘browse-url-xdg-open url args)))
    (eval-after-load ‘browse-url
      ‘(defun browse-url-default-browser (url &rest args)
         " Use EWW as the default browser for search web package. But
    you should set the variable `shr-external-browser‘ to
    browse-url-xdg-open to make `eww-browse-with-external-browser‘ to
    work as expected."
         (apply ‘eww-browse-url
                url args)))
    
    (defun eww-follow-link-before-advice (&optional external mouse-event)
      (eww-save-history)
      )
    (advice-add ‘eww-follow-link :before #‘eww-follow-link-before-advice)
    

    本作品采用知识共享署名-非商业性使用-禁止演绎 3.0 未本地化版本许可协议 进行许可。

原文地址:https://www.cnblogs.com/bu-wu-zheng-ye/p/11718226.html

时间: 2024-10-12 06:08:52

在 Emacs 中集成 Recoll 全文搜索的相关文章

使用Logstash同步数据至Elasticsearch,Spring Boot中集成Elasticsearch实现搜索

安装logstash.同步数据至ElasticSearch 为什么使用logstash来同步,CSDN上有一篇文章简要的分析了以下几种同步工具的优缺点:https://blog.csdn.net/laoyang360/article/details/51694519. 下面开始实践: 1. 下载Logstash安装包,需要注意版本与elasticsearch保持一致,windows系统下直接解压即可. 2.添加同步mysql数据库的配置,并将mysql连接驱动jar包放在指定的配置目录 注: 目

如何在MySQL中获得更好的全文搜索结果

很多互联网应用程序都提供了全文搜索功能,用户可以使用一个词或者词语片断作为查询项目来定位匹配的记录.在后台,这些程序使用在一个SELECT 查询中的LIKE语句来执行这种查询,尽管这种方法可行,但对于全文查找而言,这是一种效率极端低下的方法,尤其在处理大量数据的时候. mysql针对这一问题提供了一种基于内建的全文查找方式的解决方案.在此,开发者只需要简单地标记出需要全文查找的字段,然后使用特殊的MySQL方法在那些字段运行搜索,这不仅仅提高了性能和效率(因为MySQL对这些字段做了索引来优化搜

seci-log 1.10 发布 增加了全文搜索集成密码加密等多个功能点

日志分析软件增加了多个功能点 1.修改了windows2003 扫描资产的错误. 2.增加了密码加密功能,对邮件,远程机器访问的秘密进行加密,会更安全一些. 3.增加了资产统计报表 4.完善了整体报告,增加了告警主机排行和告警类型排行. 5.增加了登录统计报表 6.整合了全文搜索.这样就可以去掉了Kibana,虽然我们的功能还是有点弱,但是查询没有问题了.具体看下图,搜索192.168.0.104 loginin su就会像百度一下吧相关日志搜索出来. 欢迎大家使用

Python下实现文件中的全文搜索小测试

username = 'test' password = '123456' while True: user_str = raw_input("Please input your name>>") pass_str = raw_input("Please input your password>>") if username != user_str or password != pass_str: print "Sorry,You 

php+中文分词scws+sphinx+mysql打造千万级数据全文搜索

Sphinx是由俄罗斯人Andrew Aksyonoff开发的一个全文检索引擎.意图为其他应用提供高速.低空间占用.高结果 相关度的全文搜索功能.Sphinx可以非常容易的与SQL数据库和脚本语言集成.当前系统内置MySQL和PostgreSQL 数据库数据源的支持,也支持从标准输入读取特定格式 的XML数据.Sphinx创建索引的速度为:创建100万条记录的索引只需3-4分钟,创建1000万条记录的索引可以在50分钟内完成,而只包含最新10万条记录的增量索引,重建一次只需几十秒.Sphinx的

Flask 教程 第十六章:全文搜索

本文翻译自The Flask Mega-Tutorial Part XVI: Full-Text Search 这是Flask Mega-Tutorial系列的第十六部分,我将在其中为Microblog添加全文搜索功能. 本章的目标是为Microblog实现搜索功能,以便用户可以使用自然语言查找有趣的用户动态内容.许多不同类型的网站,都可以使用Google,Bing等搜索引擎来索引所有内容,并通过其搜索API提供搜索结果. 这这方法适用于静态页面较多的的大部分网站,比如论坛. 但在我的应用中,基

MySQL 全文搜索支持, mysql 5.6.4支持Innodb的全文检索和类memcache的nosql支持

背景:搞个个人博客的全文搜索得用like啥的,现在mysql版本号已经大于5.6.4了也就支持了innodb的全文搜索了,刚查了下目前版本号都到MySQL Community Server 5.6.19 了,所以,一些小的应用可以用它做全文搜索了,像sphinx和Lucene这样偏重的.需要配置或开发的,节省了成本. 这儿有一个原创的Mysql全文搜索的文章, mysql的全文搜索功能:http://blog.csdn.net/bravekingzhang/article/details/672

【转】 Mysql全文搜索match...against的用法

原文链接 http://blog.csdn.net/manbujingxin/article/details/6656992 前提:mysql只支持英文内容的全文索引,所以只考虑英文的全文搜索. 假定数据表名为post,有三列:id.title.content.id是自增长序号, title是varchar,content是text,给content添加全文索引.mysql全文搜索有三种模式:一.自然语言查找.这是mysql默认的全文搜索方式,sql示例: 1 select  id,title 

[Elasticsearch] 全文搜索 (一) - 基础概念和match查询

全文搜索(Full Text Search) 现在我们已经讨论了搜索结构化数据的一些简单用例,是时候开始探索全文搜索了 - 如何在全文字段中搜索来找到最相关的文档. 对于全文搜索而言,最重要的两个方面是: 相关度(Relevance) 查询的结果按照它们对查询本身的相关度进行排序的能力,相关度可以通过TF/IDF,参见什么是相关度,地理位置的邻近程度(Proximity to a Geo-location),模糊相似性(Fuzzy Similarity)或者其它算法进行计算. 解析(Analys