一、前言

  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. php手记之02-tp5请求参数读取三种方式

    01-[推荐方式] 当浏览器向Web服务器发出请求时,它向服务器传递了一个数据块,也就是请求信息.在Thinkphp5.1中,获取请求对象数据,是由think\Request类负责,在很多场合下并不需 ...

  2. AI案例

    https://www.bilibili.com/read/cv830627     到底什么是人工智能?人工智能能做什么?这是大家最关心的问题,但说到真正能够理解的话,还是只小部分专业人士.这篇文章 ...

  3. UVA:1600 巡逻机器人

    机器人要从一个m*n(m和n的范围都在1到20的闭区间内)的网格的左上角(1,1)走到右下角(m,n).网格中的一些格子是空地,用0表示,其它格子是障碍,用1表示.机器人每次可以往四个方向走一格,但不 ...

  4. MySQL批量导入Excel、txt数据

    MySQL批量导入Excel.txt数据 我想Excel是当今最大众化的批量数据管理软件了吧,所以我们会经常涉及到将Excel中数据导入到MySQL中的工作.网上有一些关于直接将Excel导入MySQ ...

  5. osg 三维模型加载与解析(fbx、3ds、ive、obj、osg)

    void TeslaManage::OnlineTreeViewDoubleClick(const QModelIndex & index) { int row = index.row(); ...

  6. osg MatrixManipulator CameraManipulator

    <osgGA/MatrixManipulator>:No such file or directory 修改为 #include <osgGA/CameraManipulator&g ...

  7. Django文档

    https://docs.djangoproject.com/zh-hans/2.1/

  8. 【Leetcode_easy】1103. Distribute Candies to People

    problem 1103. Distribute Candies to People solution:没看明白代码... class Solution { public: vector<int ...

  9. 汉化Git Gui

    先来一个图: 其实使用自带的图形化操作git还是很方便的,但是英文界面还是让相当一部分小伙伴不太舒服,比如我哈. 汉化包地址:链接: https://pan.baidu.com/s/1qQtBUsf1 ...

  10. HTML中,a href =" "和 a href ="#"的区别

    a href ="" 刷新当前页面,回到页面顶部a href ="#"不会刷新页面,回到页面顶部.浏览器地址栏网址后面会多显示1个#.