一、前言

  1.1  应用场景  

  • 有时在搜索的时候,会根据需要的不同,对不同的关键值或者不同的关键索引分配不同的权值,让权值高的内容更容易被用户搜索出来,而且排在前面。

    为索引域添加权是再创建索引之前,把索引域的权值设置好,这样,在进行搜索时,lucene会对文档进行评分,这个评分机制是跟权值有关的,而且其它情况相同时,权值跟评分是成正相关的。

  1.2  案例  

public class IndexTest2 {

    private String ids[] = { "1", "2", "3", "4" };
private String authors[] = { "Jack", "Marry", "John", "Json" };
private String positions[] = { "accounting", "technician", "salesperson", "boss" };
private String titles[] = { "Java is a good language.", "Java is a cross platform language", "Java powerful",
"You should learn java" };
private String contents[] = { "If possible, use the same JRE major version at both index and search time.",
"When upgrading to a different JRE major version, consider re-indexing. ",
"Different JRE major versions may implement different versions of Unicode,",
"For example: with Java 1.4, `LetterTokenizer` will split around the character U+02C6," }; /**
* 获取IndexWriter写索引实例对象
*
* @return
* @throws IOException
* @throws Exception
*/
public IndexWriter getWriter() throws IOException { IndexWriter writer = null;
Directory dir = FSDirectory.open(Paths.get("E:\\lucene3"));
Analyzer analyzer = new StandardAnalyzer();
IndexWriterConfig conf = new IndexWriterConfig(analyzer); writer = new IndexWriter(dir, conf); return writer;
} /**
* 生成索引
*
* @throws IOException
*/
@Test
public void index() throws IOException {
IndexWriter writer = getWriter(); for (int i = 0; i < ids.length; i++) {
Document doc = new Document();
/**
* Document.add方法中添加的如果是StringField,则不会分词,不管字符串有多长, 如果需要分词则使用TextField类
*/
doc.add(new StringField("id", ids[i], Field.Store.YES));
doc.add(new StringField("author", authors[i], Field.Store.YES));
doc.add(new StringField("position", positions[i], Field.Store.YES)); /**
* 加权
*/
TextField field=new TextField("title", titles[i], Field.Store.YES);
if(positions[i].equals("boss")) {
field.setBoost(2.0f);
}
doc.add(field);
doc.add(new TextField("content", contents[i], Field.Store.NO)); writer.addDocument(doc);
}
writer.close(); } /**
* 根据关键字搜索搜索
* @throws Exception
*/
@Test
public void search() throws Exception { //directory 指向索引所在目录
Directory directory = FSDirectory.open(Paths.get("E:\\lucene3"));
IndexReader reader = DirectoryReader.open(directory);
IndexSearcher searcher = new IndexSearcher(reader);
//key为要搜索的内容
String key="java";
Term t=new Term("title",key);
Query query=new TermQuery(t);
TopDocs hits=searcher.search(query, 20);
System.out.println("匹配 '"+key+"',总共查询到"+hits.totalHits+"个文档");
for(ScoreDoc scoreDoc:hits.scoreDocs) {
Document doc=searcher.doc(scoreDoc.doc);
System.out.println(doc.get("author"));
}
reader.close();
} }
  • 注意代码中橙色加注的代码为加权操作
  • field.setBoost(2.0f); 该方法在lucene7.0以上是没有的,本文的lucene的版本为5.5.0
  • lucene5.5.0 版本 只能使用luke5.5.0版本打开索引,否则打开luke报错
  • 结果:

  1.3  番外

  • 如果没有加权操作,即上述代码去掉下面内容:
field.setBoost(2.0f);
  • 结果:

  • 可见之前的加权操作是生效的。Json的position为“boss”,则其权重被调到了2.0f(小于1.0f则是降权)。

(四)lucene之文本域加权的更多相关文章

  1. HTML学习笔记 域元素(form表单、textarea文本域、fieldset域集合、input使用) 案例 第四节 (原创)

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. Lucene中的域选项

    Field类是lucene在索引过程中的一个很重要的类,该类控制着域值被索引的方式 域选项主要包括以下几种选项:域索引选项.域存储选项.域的项向量选项.域的排序选项等 域索引选项:通过倒排索引来控制域 ...

  3. 面板JPanel,滚动面板JScrollPane,文本域JTextArea

    [面板JPanel] 面板就是一个容器 每一个容器都可以有一个自己的独立的布局和组件,这些容器之间也不会互相干扰 //导入Java类 import javax.swing.*; import java ...

  4. 苹果手机IOS中div contenteditable=true 仿文本域无法输入编辑

    问题: 在苹果手机IOS中 contenteditable="true" 做文本域输入,点击可以弹出键盘但是无法输入,安卓都正常. 经测试后,记得加一个样式 -webkit-use ...

  5. 解决:HTML中多文本域(textarea)回车后数据存入数据库,EL表达式取出异常。

    问题描述: 当多文本域(textarea)回车后数据存入数据库. EL表达式取出异常,值换行倒置页面报错. 问题解决: 存值脚本代码,提交前转换\n为<br/>. <script t ...

  6. 文本域的宽度和高度应该用cols和rows来控制,还是 用width和height来控制

    文本域宽度如果用cols来控制,缩放网页的时候文本域的宽度不会自动变化 用width来表示就会跟着网页缩放而缩放 看到下面一段文字: 对于内容至上的网页,在禁用CSS的情况下,HTML内容要做到易于阅 ...

  7. HTML文本域属性设置

    1.设置文本域的字体 <TEXTAREA STYLE="font-size:9pt;font-family:verdana;color:#333333">输入内容< ...

  8. jquery 文本域光标操作(选、添、删、取)

    一.JQuery扩展 ; (function ($) { /* * 文本域光标操作(选.添.删.取)的jQuery扩展 http://www.cnblogs.com/phpyangbo/p/55286 ...

  9. javaSwing文本域文件

    public class JTextAreaTest extends JFrame{    public JTextAreaTest()    {            setSize(200, 40 ...

随机推荐

  1. legend3---19、要更多的从服务器端控制元素的显示和隐藏,而不要是页面端

    legend3---19.要更多的从服务器端控制元素的显示和隐藏,而不要是页面端 一.总结 一句话总结: 这样可以控制很多页面端的非法操作 1.html标签中data方式的数据,修改之后在标签上只显示 ...

  2. Get Argument Values From Linq Expression

    Get Argument Values From Linq Expression If you even find yourself unpacking an expression in C#, yo ...

  3. pecl和pear 的区别和联系

    Pear:是PHP的扩展代码包,所有的扩展均以PHP代码的形式出现,功能强大,安装简单,甚至可以改改就用.使用的时候,要在代码中进行Include才能够使用. Pecl:是PHP的标准扩展,可以补充实 ...

  4. 使用python显示当前系统中的所有进程并关闭某一进程

    环境: Windows 10操作系统 python idle 原理: 调用windows系统自带的命令task,该命令使用方式: 第一步.调用cmd命令行,显示当前系统中所有进程: Win+R-> ...

  5. H5内嵌原生app

    前言 其实我们不管是从ios还是安卓都可以看出 原生app能内嵌H5的原因是因为有了webview这个app内嵌浏览器视图,从而使得我们可以开发html然后加载到app中(原理几乎跟pc端请求.加载. ...

  6. YApi内部部署文档

    旨在为开发.产品.测试人员提供更优雅的接口管理服务.可以帮助开发者轻松创建.发布.维护 API 1.安装Node.js环境(7.6+) 1.官网下载适合的nodejs版本放置在/usr/package ...

  7. Java RSA分段加密

    我们通过Java进行RSA加密的时候,可能会出现如下问题: /** * 私钥加密 * * @param data 待加密数据 * @param key 密钥 * @return byte[] 加密数据 ...

  8. Core Data 多表关联

    1.概念简介 coreData中存在复杂的数据关系时,一张表难以满足需求,此时就需要了解使用coreData多表的关联使用. 如 课程表 和 章节表 的关系:一个课程跟章节的对应关系是 一对多,单一个 ...

  9. 【数据库开发】MySQL命令大全

    1.连接Mysql 格式: mysql -h主机地址 -u用户名 -p用户密码1.连接到本机上的MYSQL. 首先打开DOS窗口,然后进入目录mysql\bin,再键入命令mysql -u root ...

  10. 向量空间模型(Vector Space Model)

    搜索结果排序是搜索引擎最核心的构成部分,很大程度上决定了搜索引擎的质量好坏.虽然搜索引擎在实际结果排序时考虑了上百个相关因子,但最重要的因素还是用户查询与网页内容的相关性.(ps:百度最臭名朝著的“竞 ...