【转载保存】lucene3.0可以对docId、docField、queryParser设置Boost值来影响排序结果

转自:http://catastiger.iteye.com/blog/803796

前提:不对结果做sort操作. 
   在搜索中,并不是所有的Document和Fields都是平等的.有些技术会要求到对其Doucment或者Fields的权值改变,默认值为:1.0F,以上需求都是通过改变Document的boost因子来改变的. 下面是通过lucene3.0,IKAnalyzer 
1.通过设置doc boost改变排序结果 
 

Java代码  

  1.     /** 
  2.      * 设置DOC boost 值影响查询排序结果 
  3.      * @throws Exception 
  4.      */  
  5.     public void testBoost1() throws Exception{  
  6.         System.out.println("设置DOC boost 值影响查询排序结果");  
  7.         RAMDirectory ramDir = new RAMDirectory();  
  8.         Analyzer analyzer = new IKAnalyzer();  
  9.         IndexWriter iw = new IndexWriter(ramDir, analyzer, true ,IndexWriter.MaxFieldLength.LIMITED);  
  10.           
  11.         String[] nameList = { "you are my friend", "a are my wife", "I love you" };  
  12.         String[] addList = { "b", "you are my wife", "c" };  
  13.         String[] fileList = { "1", "2", "3" };  
  14.   
  15.         for (int i = 0; i < nameList.length; i++){  
  16.             Document doc = new Document();  
  17.             doc.add(new Field("name", nameList[i], Field.Store.YES, Field.Index.ANALYZED));  
  18.             doc.add(new Field("file", fileList[i], Field.Store.YES, Field.Index.ANALYZED));  
  19.             doc.add(new Field("address", addList[i], Field.Store.YES, Field.Index.ANALYZED));  
  20.             if (i == 2) {  
  21.                 doc.setBoost(2.0f);   
  22.             }  
  23. //            这里设置了第三个文档优先级最高,所以在搜索出来的结果中,该文档排在最前  
  24.             iw.addDocument(doc);  
  25.         }  
  26.         iw.close();  
  27.   
  28.         IndexSearcher _searcher = new IndexSearcher(ramDir);  
  29.         String[] fields =new String[]{"name","address"};  
  30.         Query query=IKQueryParser.parseMultiField(fields, "you");  
  31.   
  32.         TopDocs topDocs = _searcher.search(query,_searcher.maxDoc());  
  33.         ScoreDoc[] hits = topDocs.scoreDocs;  
  34.         for (int i = 0; i < hits.length; i++) {  
  35.             Document doc = _searcher.doc(hits[i].doc);  
  36.             System.out.println("name:"+doc.get("name"));  
  37.             System.out.println("file:"+doc.get("file"));  
  38.         }  
  39.         _searcher.close();  
  40.           
  41.     }  
  42.   
  43.     


if (i == 2) { doc.setBoost(2.0f); }这样I love you 将先输出, 
2.通过设置query 影响排序 

Java代码  

  1.  /** 
  2.      * 设置query boost值影响排序结果,如果有排序sort,则完全按照sort结果进行 
  3.      * @throws Exception 
  4.      */  
  5.     public void testBoost2() throws Exception{  
  6.         System.out.println("设置query boost值影响排序结果");  
  7.         RAMDirectory ramDir = new RAMDirectory();  
  8.         Analyzer analyzer = new IKAnalyzer();  
  9.         IndexWriter iw = new IndexWriter(ramDir, analyzer, true ,IndexWriter.MaxFieldLength.LIMITED);  
  10.           
  11.         String[] nameList = { "you are my friend", "a are my wife", "I love you" };  
  12.         String[] addList = { "b", "you are my wife", "c" };  
  13.         String[] fileList = { "1", "2", "3" };  
  14.   
  15.         for (int i = 0; i < nameList.length; i++)  
  16.         {  
  17.             Document doc = new Document();  
  18.             doc.add(new Field("name", nameList[i], Field.Store.YES, Field.Index.ANALYZED));  
  19.             doc.add(new Field("file", fileList[i], Field.Store.YES, Field.Index.ANALYZED));  
  20.             doc.add(new Field("address", addList[i], Field.Store.YES, Field.Index.ANALYZED));  
  21.             iw.addDocument(doc);  
  22.         }  
  23.         iw.close();  
  24.         IndexSearcher _searcher = new IndexSearcher(ramDir);  
  25.           
  26.         BooleanQuery bq = new BooleanQuery();  
  27.         QueryParser _parser = new QueryParser(Version.LUCENE_30,"name",analyzer);  
  28.         Query  _query = _parser.parse("you");  
  29.         _query.setBoost(2f);  
  30.           
  31.         QueryParser _parser1 = new QueryParser(Version.LUCENE_30,"address",analyzer);  
  32.         Query  _query1 = _parser1.parse("you");  
  33.         _query1.setBoost(1f);  
  34.          
  35.         bq.add(_query, BooleanClause.Occur.SHOULD);  
  36.         bq.add(_query1, BooleanClause.Occur.SHOULD);  
  37. //         
  38.           
  39. //          for(int i=0;i<2;i++){  
  40. //              QueryParser parser = new MultiFieldQueryParser(Version.LUCENE_30,new String[] {"name", "address" }, analyzer);  
  41. //              Query q1 = parser.parse("you");  
  42. //              bq.add(q1, BooleanClause.Occur.MUST);  
  43. //          }  
  44. //           
  45. //         SortField[] sortFields = new SortField[1];    
  46. //         SortField sortField = new SortField("file", SortField.INT, true);//false升序,true降序    
  47. //         sortFields[0] = sortField;    
  48. //         Sort sort = new Sort(sortFields);    
  49. //         TopDocs topDocs = _searcher.search(bq,null,_searcher.maxDoc(),sort);  
  50. //          
  51.           
  52.         TopDocs topDocs = _searcher.search(bq,_searcher.maxDoc());  
  53.         ScoreDoc[] hits = topDocs.scoreDocs;  
  54.         for (int i = 0; i < hits.length; i++) {  
  55.             Document doc = _searcher.doc(hits[i].doc);  
  56.             System.out.println("name:"+doc.get("name"));  
  57.             System.out.println("file:"+doc.get("file"));  
  58.         }  
  59.         _searcher.close();  
  60.           
  61.     }  


结果如下:(name 的boost最高,所以name优先于address排序在前面) 
设置query boost值影响排序结果 
name:you are my friend 
file:1 
name:I love you 
file:3 
name:a are my wife 
file:2 

3.通过设置fields 的boost 影响排序 

Java代码  

  1. /** 
  2.      * 设置field boost 值影响查询排序结果,有排序则按照排序 
  3.      * @throws Exception 
  4.      */  
  5.      //没设置field boost 213 设置后是132  
  6.     public void testBoost3() throws Exception{  
  7.         System.out.println("设置fields boost 值影响查询排序结果");  
  8.         RAMDirectory ramDir = new RAMDirectory();  
  9.         Analyzer analyzer = new IKAnalyzer();  
  10.         IndexWriter iw = new IndexWriter(ramDir, analyzer, true ,IndexWriter.MaxFieldLength.LIMITED);  
  11.         String[] nameList = { "you are my friend", "a are my wife", "I love you" };  
  12.         String[] addList = { "b", "you are my wife", "c" };  
  13.         String[] fileList = { "1", "2", "3" };  
  14.   
  15.         for (int i = 0; i < nameList.length; i++)  
  16.         {  
  17.             Document doc = new Document();  
  18.             Field nameField =  new Field("name", nameList[i], Field.Store.YES, Field.Index.ANALYZED);  
  19.             nameField.setBoost(20f);  
  20.             doc.add(nameField);  
  21.             doc.add(new Field("file", fileList[i], Field.Store.YES, Field.Index.ANALYZED));  
  22.             Field f = new Field("address", addList[i], Field.Store.YES, Field.Index.ANALYZED);  
  23.             f.setBoost(30f);  
  24.             doc.add(f);  
  25.             iw.addDocument(doc);  
  26.         }  
  27.         iw.close();  
  28.           
  29.          
  30.         IndexSearcher _searcher = new IndexSearcher(ramDir);  
  31.         String[] fields =new String[]{"name","file","address"};  
  32.         Query query=IKQueryParser.parseMultiField(fields, "you");  
  33.           
  34. //        SortField[] sortFields = new SortField[1];    
  35. //        SortField sortField = new SortField("file", SortField.INT, true);//false升序,true降序    
  36. //        sortFields[0] = sortField;    
  37. //        Sort sort = new Sort(sortFields);    
  38. //        TopDocs topDocs = _searcher.search(query,null,_searcher.maxDoc(),sort);  
  39.           
  40.         TopDocs topDocs = _searcher.search(query,_searcher.maxDoc());  
  41.         ScoreDoc[] hits = topDocs.scoreDocs;  
  42.         for (int i = 0; i < hits.length; i++) {  
  43.             Document doc = _searcher.doc(hits[i].doc);  
  44.             System.out.println("name:"+doc.get("name"));  
  45.             System.out.println("file:"+doc.get("file"));  
  46.         }  
  47.         _searcher.close();  
  48.           
  49.     }  


结果如下:(address 的boost最高,先排在前面了) 
设置fields boost 值影响查询排序结果 
name:a are my wife 
file:2 
name:you are my friend 
file:1 
name:I love you 
file:3 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/508903.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

lucene6.0 查询语句设置关键字boost值

代码模板&#xff1a; public class Demo {public static void main(String[] args) throws IOException, Exception {//建立索引String indexDirPath util.Directory.GetAppPath("indexDir");Path path Paths.get(indexDirPath);StandardAnalyzer analyzer new …

【转载保存】Lucene7.1.0超详细的使用文档

转载地址&#xff1a;https://www.cnblogs.com/houzheng/p/9150314.html

【转载保存】lucene优秀文章整理

Lucene解析 - 基本概念: https://www.jianshu.com/p/fbb171e73721?fromtimeline&isappinstalled0 Lucene DocValues——没有看懂: https://www.cnblogs.com/bonelee/p/6669263.html Lucene DocValues详解: https://blog.csdn.net/zteny/article/details/60633374 So…

lucene中write.lock索引锁机制的原理

write.lock加锁的实现原理&#xff1a; 实现源码&#xff08;lucene 6.0&#xff09;&#xff1a; Override protected Lock obtainFSLock(FSDirectory dir, String lockName) throws IOException {Path lockDir dir.getDirectory();// Ensure that lockDir exists and is a…

正则表达式大全

[正则表达式]文本框输入内容控制 整数或者小数&#xff1a;^[0-9]\.{0,1}[0-9]{0,2}$ 只能输入数字&#xff1a;"^[0-9]*$"。 只能输入n位的数字&#xff1a;"^\d{n}$"。 只能输入至少n位的数字&#xff1a;"^\d{n,}$"。 只能输入m~n位的数字&am…

天气数据获取接口和网址汇总

免费API&#xff1a;https://www.sojson.com/blog/305.html 爬取网址&#xff1a;http://www.weather.com.cn/ https://www.tianqi.com/chinacity.html

鸡汤

史蒂芬柯维的7个习惯就是自己的原则和价值观&#xff1a; 积极主动以终为始要事第一双赢思维知彼解己综合综效不断更新 稻盛和的原则和价值观比如六项精进&#xff1a; 付出不亚于任何人的努力要谦虚&#xff0c;不要骄傲要每天反省或者就要感谢积善行&#xff0c;思利他不要…

【转载保存】索引文件锁LockFactory

索引文件锁LockFactory LockFactory在Lucene中用来对索引文件所在的目录进行加锁&#xff0c;使得同一时间总是只有一个IndexWriter对象可以更改索引文件&#xff0c;即保证单进程内(single in-process)多个不同IndexWriter对象互斥更改&#xff08;多线程持有相同引用的IndexW…

lucene大牛博客汇总保存

https://www.amazingkoala.com.cn/Lucene/Index/http://codepub.cn/tags/Lucene/

no segments* file found in SimpleFSDirectory问题总结

lucene6.0版本 场景一&#xff1a;第一次启动程序索引库为空抛出异常 最近在写lucene发现利用lucene6.0版本时候如果索引库为空构建indexWriter&#xff0c;代码如下&#xff1a; IndexWrterConfig config new IndexWriterConfig(analyzer); IndexWriter indexWriter new …

lucene Term查询

查询demo Path path Paths.get(util.Directory.GetAppPath("indexDir"));IndexReader reader DirectoryReader.open(FSDirectory.open(path));//获取IndexSearcher对象IndexSearcher indexSearcher new IndexSearcher(reader);Query query new TermQuery(new Ter…

IndexOptions类说明

IndexOptions是在lucene-core-x.jar包下面&#xff0c;其作用是在新建索引时候选择索引属性。 IndexOptions是一个枚举类&#xff1a; 枚举变量说明&#xff1a; NONE不被索引DOCS_AND_FREQS文档和词频建立索引DOCS_AND_FREQS仅对文档和词频建立索引DOCS_AND_FREQS_AND_POSIT…

【转载保存】lucene正则查询使用注意

今天要分享的是关于lucene中另外一种丰富的查询方式----正则查询&#xff0c;lucene内置了许多的查询API&#xff0c;以及更强大的自定义查询方式的QueryParse&#xff0c;大部分情况下我们使用内置的查询API&#xff0c;基本上就可以满足我们的需求了&#xff0c;但是如果你想…

lucene 各个版本介绍

官方说明文档&#xff1a;https://lucene.apache.org/core/8_3_0/changes/Changes.html#v8.3.0.other 开源中国翻译&#xff1a;https://www.oschina.net/p/lucene

【转载保存】搜索引擎调研文档

搜索引擎选型调研文档 Elasticsearch简介* Elasticsearch是一个实时的分布式搜索和分析引擎。它可以帮助你用前所未有的速度去处理大规模数据。 它可以用于全文搜索&#xff0c;结构化搜索以及分析&#xff0c;当然你也可以将这三者进行组合。 Elasticsearch是一个建立在全…

webmagic抓取实例

git地址&#xff1a;https://github.com/code4craft/webmagic/tree/master/webmagic-samples/src/main/java/us/codecraft/webmagic/samples

lucene详细说明文档

以下部门功能在lucene5以上版本可能有的API所有改变 目录1.简介 2.了解索引操作 2.1倒排索引 2.2字段类型 2.3细分 2.4文件编号 2.5搜索索引 3.创建索引 4.基本索引操作 4.1核心索引类 4.2将数据添加到索引 5.文件和领域 5.1文件 5.2领域 5.3在Lucene中增强文档 1.简介 该索引是…

SimpleDateFormat(线程不安全)与DateTimeFormatter(线程安全)

https://www.liaoxuefeng.com/wiki/1252599548343744/1303985694703650