java - 在 Java api 中的 Solr 搜索中需要搜索的文本和围绕它的几行
问题描述
我正在使用 solr 7.7.2,我使用 solrj 在 Solr 中编写了一个 Java 程序,该程序在一个巨大的文本文件中搜索一个单词。我使用以下代码来显示代表整个文本的搜索结果。
SolrQuery params = new SolrQuery();
params.setQuery("content:word for search");
如何仅显示该行中单词所在的一行文本?
所有代码都是这样的
public static void main(String args[]) throws SolrServerException, IOException
{
String urlString = "http://localhost:8983/solr/test_core";
SolrClient Solr = new HttpSolrClient.Builder(urlString).build();
SolrQuery params = new SolrQuery();
params.setQuery("content:word for search");
params.setSort("score", SolrQuery.ORDER.desc);
QueryResponse queryResponse = Solr.query(params);
SolrDocumentList result = queryResponse.getResults();
for (int i = 0 ; i < result.size(); i++ )
{
System.out.println(result.get(i) + " \n");
}
}
解决方案
Highlighting
是 solr 功能之一。您必须通过查询参数来实现突出显示如下:-
hl
– 设置为 true,它可以在查询响应中生成突出显示的片段。
hl.fl
– 提及要突出显示的字段列表。char * 将突出显示所有字段
hl.fragsize
– 荧光笔创建的片段(又名片段)的大小(以字符为单位)。在原来的 Highlighter 中,“0”表示应该使用整个字段值,不要分片。默认情况下,片段大小为 100 个字符
通过添加以下代码进行检查。
params.setHighlight(true).setHighlightSnippets(1);
params.setParam("hl.fl", "*");
params.setParam("hl.fragsize", "0");
这是您尝试的完整代码。
注意:请忽略代码中的硬编码内容,例如硬编码 url "solrUrl = " http://localhost:8983/solr " 和字符串 "return "Success""。这些应该从属性文件和常量文件中读取. 期望你也这样做。永远不要在你的生产代码中使用 System out。
public String getResult() throws SolrServerException, IOException {
final SolrClient client = getSolrClient();
ModifiableSolrParams params = new ModifiableSolrParams ();
params.set ("q", "comment_t:pizza");
params.set ("fl", "id, comment_t");
params.set ("sort", "id asc");
params.set("hl", true);
params.set("hl.q", "pizza");
params.set("hl.simple.pre", "<strong>");
params.set("hl.simple.post", "</strong>");
params.set("hl.fl", "comment_t");
params.set("hl.fragsize", "100");
final QueryResponse response = client.query("demo", params);
response.getHighlighting();
final SolrDocumentList documents = response.getResults();
System.out.println("Found " + documents.getNumFound() + " documents");
for (SolrDocument document : documents) {
final String id = (String) document.getFirstValue("id");
final String name = (String) document.getFirstValue("comment_t");
System.out.println("id: " + id + "; comment_t: " + name);
if(response.getHighlighting() != null){
System.out.println("highlighted text :: " + response.getHighlighting());
}
}
return "Success";
}
private SolrClient getSolrClient() {
final String solrUrl = "http://localhost:8983/solr";
return new HttpSolrClient.Builder(solrUrl).withConnectionTimeout(10000).withSocketTimeout(60000).build();
}
请找到输出的屏幕截图:
推荐阅读
- symfony - 最佳实践 - 如何响应不同的实体视图以提高 RESTful API 的性能(Symfony 4)
- javascript - 覆盖 Highcharts 中自动生成的 Y 轴绘图区域值
- php - TDAmeritrade API 身份验证错误:无法解析 API 密钥变量 request.header.un
- angular - 我可以将 ng 模板用于单独的组件并在其他 html 中使用其模板引用吗?
- c++ - ml::KNearest->findNearest() 类别标签更改时结果不一致
- java - 停止 Maven 安装
- typescript - Typescript Pick Array 未按预期工作
- python-3.x - 如何使用 pyVmomi 从 Vsphere 集群中的服务器获取文件到远程(主机)pc
- database - Laravel DB 查询在一段时间后返回 NULL
- c# - 同一控制器的不同类型的身份验证