在 Mapping 里面,将 dynamic 参数设置成 strict 可以拒绝索引包含未知字段的文档。 此条 Tips 由 medcl 贡献。

elasticsearch-jdbc 2.0+是怎么用的?

Elasticsearchtwinboss 回复了问题 • 4 人关注 • 3 个回复 • 4817 次浏览 • 2016-10-11 12:51 • 来自相关话题

marvel插件,不能显示数据

默认分类medcl 回复了问题 • 2 人关注 • 1 个回复 • 5620 次浏览 • 2016-07-05 23:24 • 来自相关话题

关于商品不同属性不同的mapping应该如何建立

Elasticsearchliuping 回复了问题 • 5 人关注 • 4 个回复 • 4245 次浏览 • 2017-05-09 09:18 • 来自相关话题

kibana如何使用metric显示进过过滤后的统计信息

Kibanayqcute 回复了问题 • 3 人关注 • 2 个回复 • 9653 次浏览 • 2016-08-26 08:50 • 来自相关话题

请问kibana如何添加离线地图

Kibanamedcl 回复了问题 • 3 人关注 • 1 个回复 • 8477 次浏览 • 2016-07-05 23:21 • 来自相关话题

我的问题:redis->logstash->mysql

回复

Logstashlongjq 回复了问题 • 1 人关注 • 1 个回复 • 6231 次浏览 • 2016-06-29 18:46 • 来自相关话题

Correlation问题

Elasticsearchbillzy 回复了问题 • 3 人关注 • 2 个回复 • 4438 次浏览 • 2016-06-30 10:45 • 来自相关话题

ES远程调试的问题:

Elasticsearchnihao 回复了问题 • 2 人关注 • 2 个回复 • 5420 次浏览 • 2016-07-13 18:41 • 来自相关话题

spark sql写es时,多值字段无法直接写入

Elasticsearchjoeywen 回复了问题 • 2 人关注 • 1 个回复 • 6482 次浏览 • 2016-07-05 16:42 • 来自相关话题

elasticsearch.yml 定义的分析器 failed to find analyzer

回复

Elasticsearchzplzpl 回复了问题 • 1 人关注 • 1 个回复 • 6504 次浏览 • 2016-06-27 16:47 • 来自相关话题

一台机器开了两个节点,如何避免分片或者分片副本都在同一台机器上?

Elasticsearchkennywu76 回复了问题 • 6 人关注 • 3 个回复 • 8415 次浏览 • 2017-05-13 09:13 • 来自相关话题

es删除一个集群的某一节点

Elasticsearchflowaters 回复了问题 • 2 人关注 • 1 个回复 • 8765 次浏览 • 2016-06-25 19:23 • 来自相关话题

关于主分片以及副本数量设定

回复

Elasticsearch匿名用户 回复了问题 • 1 人关注 • 1 个回复 • 5969 次浏览 • 2016-06-25 19:27 • 来自相关话题

ES发生clear FieldData 线程和query线程死锁,导致节点query不可用

ElasticsearchPK采纳哦 回复了问题 • 14 人关注 • 9 个回复 • 8190 次浏览 • 2018-04-08 16:03 • 来自相关话题

Lucene5.5入门第十篇完结篇——使用Highlighter使关键词高亮

Lucenekl 发表了文章 • 0 个评论 • 7362 次浏览 • 2016-06-24 11:27 • 来自相关话题

前言

我们在使用百度和谷歌等搜索引擎的时候,你会发现,搜索引擎会把和我们输入的关键字以红色的字体显示,来突出显示结果的准确性,这就是高亮显示的使用场景

准备

使用Highlighter需要导入相应的jar包,maven项目可以加入如下依赖

<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-highlighter</artifactId>
<version>5.5.0</version>
</dependency>

直接看代码


/**
* @author kl by 2016/3/19
* @boke www.kailing.pub
*/
public class FieldSetBoostTest {
//索引目录
String indexDir="E:\\LuceneIndex";
//测试数据
String theme="中国";
String []title={"中国是一个伟大的国家","我爱你的的祖国,美丽的中国","是什么,中国令美日等国虎视眈眈"};
/**
* Lucence5.5返回IndexWriter实例
* @param directory
* @return
*/
public IndexWriter getIndexWriter(Directory directory){
Analyzer analyzer=new CJKAnalyzer();//中日韩二元分词
IndexWriterConfig writerConfig=new IndexWriterConfig(analyzer);
IndexWriter writer=null;
try {
writer =new IndexWriter(directory,writerConfig);
}catch (Exception e){
e.printStackTrace();
}
return writer;
}
public Directory getDirctory(String indexDir){
Directory directory=null;
try {
directory=FSDirectory.open(Paths.get(indexDir));
}catch (IOException e){
e.printStackTrace();
}
return directory;
}
/**
* 创建索引不加权
* @throws Exception
*/
public void Indexer()throws Exception{
IndexWriter writer=getIndexWriter(getDirctory(indexDir));
Document doc=null;
for(String str:title){
doc=new Document();
//Lucence5.5 Fileld有多个实现,StringFIeld不分词 TextField分词
doc.add(new StringField("theme",theme, Field.Store.YES));
Field field=new TextField("title",str, Field.Store.YES);
doc.add(field);
writer.addDocument(doc);
}
writer.close();
}

/**
* 关键命中词高亮输出处理
* @param query
* @param context
* @return
* @throws Exception
*/
public static String getHighlighterString(Query query,String context)throws Exception{
//对促成文档匹配的实际项进行评分
QueryScorer scorer=new QueryScorer(query);
//设置高亮的HTML标签格式
Formatter simpleHTMLFormatter=new SimpleHTMLFormatter("","");
//实例化高亮分析器
Highlighter highlighter=new Highlighter(simpleHTMLFormatter,scorer);
//提供静态方法,支持从数据源中获取TokenStream,进行token处理
TokenStream tokenStream=new CJKAnalyzer().tokenStream("title", new StringReader(context));
return highlighter.getBestFragment(tokenStream, context);
}
@Test
public void searcherTest()throws Exception{
// Indexer();
IndexReader reader= DirectoryReader.open(getDirctory(indexDir));
IndexSearcher is=new IndexSearcher(reader);
System.out.println("总的文档数:"+reader.numDocs());
QueryParser qp=new QueryParser("title",new CJKAnalyzer());
String q="中国";
Query query=qp.parse(q);
TopDocs tDocs=is.search(query,11);
System.out.println("查询-》"+q+"《-总共命中【"+tDocs.totalHits+"】条结果");
for (ScoreDoc scoredoc:tDocs.scoreDocs){
Document doc = is.doc(scoredoc.doc);
String context=doc.get("title");
if(context!=null){
System.out.println(getHighlighterString(query,context));
}

}
}
}
查询效果如下:

原文地址:http://www.kailing.pub/article/index/arcid/82.html