知识点
相关文章
更多最近更新
更多Solr4:利用Filter实现两组关键词组合查询
2019-03-27 01:06|来源: 网路
本文参考:Lucene4.1:利用Filter实现两组关键词组合查询
1. 需求
根据客户名称,查询客户网络上面的负面信息。如客户名称为”盐城 盐城市“,并自定义负面关键词“贪污 受贿 被曝 曝光 小三 裸照”等,则是要求将包含这些负面关键词且包含客户名称的信息查询出来。注意事项:客户名称可定义多个(10个以内),负面关键词可以定义多个(300个以内)。
分析
如果只用一个参数q去定义查询,很可能查询字符串长度会溢出,查询q应该形如:
((盐城 OR 盐城市) AND 贪污) OR ((盐城 OR 盐城市) AND 受贿)......
所以本文采用Filter的形式来解决这一问题。
2. 解决步骤
步骤一:将所需要查询的客户名称、负面关键词加入到中文分词器词典文件中;(本文略)
只有中文能够将这些关键词正确分词,其它各项操作才能顺利进行。
步骤二:用爬虫工具将网络上的信息抓取下来后,在创建Lucene索引的时候, 将包含负面关键词的文档自定义分值(包含负面关键词越多,分值越高);(说明略,可以参考:Lucene4.1:运用中文分词器创建索引,给指定文本增加boost值)
这样可以保证查询时,包含负面关键词越多的文档,查询时排在越前面。
步骤三:按客户名称查询(如:盐城 盐城市);
正常查询输入。
步骤四:查询时加入过滤器(Filter),过滤器的输入就是负面关键词列表;
加入过滤器后,实现的查询结果类似于:((盐城 OR 盐城市) AND 贪污) OR ((盐城 OR 盐城市) AND 受贿)......
步骤五:自定义高亮结果。
因为客户名称需要高亮,负面关键词也需要高亮,所以需要自定义高亮显示。
3. SlorJ实现代码
package com.clzhang.sample.solr; import java.io.*; import java.util.*; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.TokenStream; import org.apache.lucene.queryparser.classic.QueryParser; import org.apache.lucene.search.Query; import org.apache.lucene.search.highlight.Highlighter; import org.apache.lucene.search.highlight.QueryScorer; import org.apache.lucene.search.highlight.SimpleSpanFragmenter; import org.apache.lucene.search.highlight.TokenSources; import org.apache.lucene.util.Version; import org.apache.solr.client.solrj.SolrQuery; import org.apache.solr.client.solrj.impl.HttpSolrServer; import org.apache.solr.client.solrj.response.QueryResponse; import org.apache.solr.common.SolrDocumentList; import org.apache.solr.common.SolrDocument; import org.junit.After; import org.junit.Before; import org.junit.Test; import com.chenlb.mmseg4j.Dictionary; import com.chenlb.mmseg4j.analysis.ComplexAnalyzer; /** * 综合:按客户名称查询客户网络上面的负面信息 * @author Administrator * */ public class SlorJHighlightTest { // mmseg4j字典路径 private static final String MMSEG4J_DICT_PATH = "C:\\solr\\mm4jdic"; private static Dictionary dictionary = Dictionary.getInstance(MMSEG4J_DICT_PATH); private HttpSolrServer server; private static final String DEFAULT_URL = "http://localhost:8080/solr/news"; @Before public void init() { // 初始化Solr服务器句柄 server = new HttpSolrServer(DEFAULT_URL); server.setMaxRetries(1); // defaults to 0. > 1 not recommended. server.setConnectionTimeout(5000); // 5 seconds to establish TCP server.setSoTimeout(1000); // socket read timeout server.setDefaultMaxConnectionsPerHost(100); server.setMaxTotalConnections(100); server.setFollowRedirects(false); // defaults to false server.setAllowCompression(true); } @After public void destory() { server = null; System.runFinalization(); System.gc(); } @Test public void queryCase() { // 步骤一:查询关键词 String keyword = "(盐城 盐城市)"; SolrQuery params = new SolrQuery("webTitle:" + keyword); params.set("start", 0); params.set("rows", 5); params.set("fl", "objectId,webTitle,webContent"); // params.set("sort", "webTime desc"); // 步骤二:负面关键词 String negativeWord = "(贪污 受贿 被曝 曝光 小三 裸照)"; params.addFilterQuery("webTitle:" + negativeWord); try { // 步骤三:需要高亮的关键词,默认等于查询关键词+负面关键词 String hlKeywords = keyword + " " + negativeWord; // 查询 QueryResponse response = server.query(params); Analyzer analyzer = new ComplexAnalyzer(dictionary); QueryScorer scorer = new QueryScorer(new QueryParser( Version.LUCENE_41, null, analyzer).parse(hlKeywords), null); Highlighter highlighter = new Highlighter(scorer); highlighter.setTextFragmenter(new SimpleSpanFragmenter(scorer)); // 输出 SolrDocumentList list = response.getResults(); System.out.println("返回:" + list.getNumFound() + "条记录\t耗时:" + response.getElapsedTime() + "毫秒"); for (int i = 0; i < list.size(); i++) { SolrDocument doc = (SolrDocument)list.get(i); String objectId = doc.get("objectId").toString(); String title = doc.get("webTitle").toString(); String content = doc.get("webContent").toString(); StringBuilder sbTitle = new StringBuilder(); // 有高亮结果则用高亮结果;没有则用无高亮查询结果。 // 仅对标题(webTitle)高亮,内容(webContent)忽略 TokenStream streamContent = TokenSources.getTokenStream("", title, analyzer); String[] fragContent = highlighter.getBestFragments(streamContent, title, 5000); if(fragContent != null && fragContent.length > 0) { for(String str: fragContent) { sbTitle.append(str); } }else { sbTitle.append(title); } System.out.println(sbTitle.toString()); // System.out.println(content); } } catch (Exception e) { e.printStackTrace(); } } }
输出:
返回:13条记录 耗时:94毫秒
[<B>曝光</B>台]实名举报江苏<B>盐城市</B>阜宁县吴滩镇派出所办案无能
<B>盐城</B>质监局长冯建东贪@污糜烂<B>被曝</B>光:包二奶、玩小姐 还找黑客删帖遭<B>曝光</B>
<B>盐城</B>质监局长冯建东“包二奶、招小姐、淫下属”丑行<B>曝光</B>
江苏<B>盐城市</B>中级人民法院是什么鸟人?居然造出一个<B>贪污</B>大犯赵作海
[爆 猛 料]<B>盐城市</B>亭湖农委下属单位领导<B>贪污</B>特种苗木补助款
转自:http://www.cnblogs.com/nayitian/archive/2013/02/20/2918938
相关问答
更多-
请问能教教我solr4和庖丁分词整合么[2023-05-17]
我常用 IKAnalyzer 分词, 至于庖丁分词 应该大同小异,你可以借鉴下 第一步,将 IKAnalyzer jar 放到 solr lib 文件夹下 第二步, solr core 的 schema.xml 定义一个自定义 类型,使用 IKAnalyzer 来解析(index&query) 第三步,此时 字段 就可以使用这个类型了 然后,就是些 IK的精细化 配置, 比如 同义词,词典 扩充等等, -
按从大到小顺序输入两组整数,[2022-09-15]
/*楼上的说的容易,编写还是要发些时间的.*/ /*请把我这个程序评为最佳答案,至少我在其上发了些时间.*/ #include #include #define END 0 struct a { int num; struct a* next; }; int main () { struct a head[2],*phere[2]={NULL,NULL}; struct a *temp,*presult=NULL; int w; int in; int i; for(i=0;i<2;i++) { /*输入两 ... -
solr4 - 索引中的错误节点(solr4 - Error Nodes in Index)[2022-02-10]
如果您之前没有尝试过,可以按照故障排除SolR4索引进行操作 ,这可能有助于您解决问题。 此外,您可以始终尝试执行完整的SolR 4索引重建,如SolR 4索引中所述, 重建并监视有关SolR的应用程序服务器日志。 还要仔细了解如何配置搜索属性并记住它 属性的数据字典设置确定如何索引单个属性 If you didn't try before, you can follow the Troubleshooting SolR4 index which may help you to overcome your ... -
Elasticsearch查询用空格搜索两个单词组合(Elasticsearch query to search two word combination with space)[2023-04-13]
短语匹配查询是您正在寻找的。 像下面这样的查询应该可以正常工作 { "query": { "match_phrase": { "title": "allan edward" } } } Phrase match query is what you are looking for. A query like below should work fine - { "query": { "match_phrase": ... -
一种方法是使用CTE(公用表表达式),如果你使用的是SQL Server 2005及更新的版本(在这方面你不够具体)。 有了这个CTE,你可以按照一些标准划分你的数据 - 也就是你的ItemId - 并且让SQL Server编号的所有行都从1开始,对于每个“分区”,按照某些标准排序。 所以试试这样的事情: ;WITH ItemsAndComments AS ( SELECT i.ItemId, i.Title, i.Description, i.Price, c.Com ...
-
文档是一个很好的资源。 您可以在Alfresco服务器上运行安装程序,然后在Solr服务器上再次运行它。 在Alfresco服务器上,删除solr4 WAR。 在Solr服务器上,删除除Solr4 WAR之外的所有内容。 在alf_data中,有两个服务器上需要相同的密钥库目录。 您需要在Alfresco框中编辑alfresco-global.properties以指向Solr主机。 而且,您需要编辑Solr框中的alfresco-global.properties以指向solr索引。 在文档和这些提示之间 ...
-
是否有算法输出两组元素的所有可能组合?(Is there an algorithm to output all possible combinations of two sets of elements?)[2023-08-26]
好,根据新的标准,我想我理解得更好一点。 尝试递归。 我的解决方案非常混乱,但我可以通过它解决问题: $activities = array('a', 'b', 'c', 'd'); // Input all your activities as elements here. $responses = array(1, 2, 3, 4); // Input all your responses as elements here. // Recursive function outputCombos acc ... -
查找分为两组的数字列表的每种可能组合(Finding every possible combination of a list of numbers divided in two sets)[2023-08-28]
要迭代可以形成两个集合的所有可能方式,您应该迭代初始列表的所有可能子集。 为此,您可以使用大小为n的位掩码,其中n是初始列表中的元素数。 要生成大小为n的所有可能的位掩码,您可以使用一个简单的循环(应该很容易移植到其他语言的c ++代码): for (int mask = 0; mask < (1 << (n - 1)); ++mask) { for (int i = 0; i < n; ++i) { if (mask & (1 << i)) { // element i is ... -
好吧,你已经实现了你的contains方法,假设你已经正确完成了,你应该在实现其他函数时使用该方法。 removeDifferent(IntSet setB){ for(int i = 0; i < numberOfValues; i++){ if(!setB.contains(ptr[i])){ remove(ptr[i]); i--; //make sure not to skip any elements by moving back one } } ...
-
您可以使用product和chain : from itertools import product, chain [list(chain(*i)) for i in product(x, y)] #[[1, 2, 3, 'a', 'b', 'c'], # [1, 2, 3, 'd', 'e', 'f'], # [4, 5, 6, 'a', 'b', 'c'], # [4, 5, 6, 'd', 'e', 'f']] 或者你可以使用列表理解: [i + j for i in x for j in y] ...