ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

mysql-反向搜索:每个文档的短语

2019-12-10 11:17:07  阅读:307  来源: 互联网

标签:search indexing lucene full-text-search mysql


我有一个充满短语(80-100个字符)和一些冗长的文档(50-100Kb)的数据库,我想要给定文档的短语排名列表;而不是搜索引擎的通常输出,而是给定短语的文档列表.

我以前使用过MySQL全文索引,并研究了Lucene,但从未使用过.
他们似乎都倾向于比较短(搜索词)和长(文档).

您将如何获得相反的结果?

解决方法:

我对Wikipedia标题数据库做了类似的工作,每个〜50KB的文档设法减少了几百毫秒.那仍然不够快,无法满足我的需求,但也许可以为您工作.

基本上,该想法是尽可能使用散列,并且仅对可能的匹配项进行字符串比较,这是非常罕见的.

首先,获取数据库并将其转换为哈希数组.如果您有数十亿个短语,则可能不适合您.在计算哈希值时,请确保将词组传递给标记器,以消除标点符号和空格.这部分只需完成一次.

然后,使用相同的标记生成器浏览文档,保留最后的1,2,.. n个标记散列的运行列表.在每次迭代时,您都对哈希数据库中的哈希进行二进制搜索.

找到匹配项时,您将进行实际的字符串比较,以查看是否找到匹配项.

这是一些代码,我想告诉您,艰难的此示例实际上并未进行字符串比较:

            HashSet<Long> foundHashes = new HashSet<Long>();

            LinkedList<String> words = new LinkedList<String>();
            for(int i=0; i<params.maxPhrase; i++) words.addLast("");

            StandardTokenizer st = new StandardTokenizer(new StringReader(docText));
            Token t = new Token();
            while(st.next(t) != null) {
                String token = new String(t.termBuffer(), 0, t.termLength());
                words.addLast(token);
                words.removeFirst();

                for(int len=params.minPhrase; len<params.maxPhrase; len++) {
                    String term = Utils.join(new ArrayList<String>(words.subList(params.maxPhrase-len,params.maxPhrase)), " ");

                    long hash = Utils.longHash(term);

                    if(params.lexicon.isTermHash(hash)) {
                        foundHashes.add(hash);
                    }
                }
            }

            for(long hash : foundHashes) {
                if(count.containsKey(hash)) {
                    count.put(hash, count.get(hash) + 1);
                } else {
                    count.put(hash, 1);
                }
            }

标签:search,indexing,lucene,full-text-search,mysql
来源: https://codeday.me/bug/20191210/2101134.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有