lucene-SpanQuery跨度查询基础

1、跨度查询SpanQuery5个子类

SpanQuery类型                            描述

SpanTermQuery                和其他跨度查询结合使用,单独使用相当于TermQuery

SpanFirstQuery               用来匹配域中的第一个部分内的各个spans

SpanNearQuery                用来匹配临近的spans

SpanNotQuery                 用来匹配不重叠的spans

SpanOrQuery                  span查询的聚合匹配

2、测试SpanQuery

public class SpanQueryTest extends TestCase{

private RAMDirectory directory;

private IndexSearcher searcher;

private IndexReader reader;

private SpanTermQuery quick;

private SpanTermQuery brown;

private SpanTermQuery red;

private SpanTermQuery fox;

private SpanTermQuery lazy;

private SpanTermQuery Sleepy;

private SpanTermQuery dog;

private SpanTermQuery cat;

private Analyzer analyzer;

protected void setUp() throws Exception{

directory=new RAMDirectory();

analyzer=new WhitespaceAnalyzer();

IndexWriter writer=new IndexWriter(directory,analyzer,true);

Document doc=new Document();

doc.add(Field.Text("f","the quck brown fox jumps over the lazy dog"));

writer.addDocument(doc);

doc=new Document();

doc.add(Field.Text("f","the quick red fox jumps over the sleepy cat"));

writer.addDocument(doc);

writer.close();

searcher=nwe IndexSearcher(directory);

reader=IndexReader.open(directory);

quick=new SpanTermQuery(new Term("f","quick"));

brown=new SpanTermQuery(new Term("f","brown"));

red=new SpanTermQuery(new Term("f","red"));

fox=new SpanTermQuery(new Term("f","fox"));

lazy=new SpanTermQuery(new Term("f","lazy"));

sleepy=new SpanTermQuery(new Term("f","dog"));

dog=new SpanTermQuery(new Term("f","cat"));
    }

private
void assertOnlyBrownFox(Query query) throws
Exception{//检查是否返回一个匹配结果

Hits hits=searcher.search(query);

assertEquals(1,hits.length());

assertEquals("wrong doc",0,hits.id(0));

}

private
void assertBothFoxes(Query query) throws
Exception{//检查是否返回2个匹配结果

Hits hits=searcher.search(query);

assertEquals(2.hits.length());

}

private
void assertNotMatch(Query query) throws Exception{

Hits hits=searcher.search(query);

assertEquals(0,hits.length());

}

}

3、使用SpanTermQuery类,它匹配文档的方式与TermQuery相似,但是它会记录一个文档中的相同项在文档中出现的不同位置。

   SpanQuery对象一直跟踪它所匹配的结果:对于每个正进行匹配的文档,它记录下被匹配的查询文本的所有起点和终点位置(以语汇单元为一个位置)。

dumpSpans(new SpanTermQuery(new
Term("f","the")));//查询文本为the,带the的所有文档,并显示查询细节

定义一个方法dumpSpans()调用SpanQuery的一些底层API为我们查询细节。

public void dumpSpans(SpanQuery query) throws IOException{

Spans
spans=query.getSpans(reader);

System.out.println(query+":");

int
numSpans=0;

Hits
hits=searcher.search(query);

Float[]
scores=new float[2];

for (int
i0;i<hits.length();i++){

scores[hits.id(i)]=hits.score(i);

}

while
(spans.next()){//spans里是单个查询文本匹配情况情况,记录着query在文档中的位置,

//next表示query在文档中的下一个位置,以及查询文本所在的文档号

numSpans++;

int id=spans.doc();

Document doc=reader.document(id);

Token[]
tokens=AnaylzerUtilts.tokensFromAnalysis(analyzer,doc.get("f"));

StringBuffer buffer=new StringBuffer();

buffer.append("  ");

for (int i=0;i<tokens.length;i++){

if (i==spans.start()){

buffer.append("<");

}

buffer.append(tokens[i].termText());

if (i+1==spans.end()){

buffer.append(">");

}

buffer.append(" ");

}

buffer.append("("+scores[id]+")");

System.out.println(buffer);//输出spans的查询文本的在文档中本次出现的信息。

}

if
(numspans==0){

System.out.println("  
no  spans");//没有任何匹配

}

System.out.println();

}

第1次spans.next循环所输出:<the> quick
brown fox jumps over the lazy dog(0.18123456)

第2次spans.next循环所输出:the quick brown fox jumps over
<the> lazy dog(0.18123456)

第3次spans.next循环所输出:<the> quick red
fox jumps over the sleep dog(0.18123456)

第4次spans.next循环所输出:the quick red fox jumps over
<the> sleep
dog(0.18123456)

时间: 2024-10-20 03:32:37

lucene-SpanQuery跨度查询基础的相关文章

lucene-SpanFirstQuery 和SpanNearQuery 跨度查询

1.SpanFirstQuery查询 对出现在一个域中前n个位置的跨度查询. public void testSpanFirstQuery() throws Exception{ SpanzFirtsQuery sfq=new SpanFirstQuery(brown,2); assertNoMatches(sfq);//前2个位置的跨度无法匹配 sfq=new SpanFirstQuery(brown,3); assertOnlyBrownFox(sfq);//前3个位置匹配成功 } 域内容为

C#语法之Linq查询基础二

上篇C#语法之Linq查询基础一基本把Linq介绍了一下,这篇主要是列举下它的几个常见用法. 在用之前先准备些数据,新建了两个类Student.Score,并通过静态方法提供数据. using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace LinqDemo { public class Student {

我们曾经心碎的数据库之 数据查询基础

第九章  数据查询基础 1.记录集: 记录集是符合查询条件的记录组织在一起的类似于表结构的查询结果 2.使用select语句进行查询 语法: select 列名 from 表名 where 查询条件表达式 order by 排序的列名 [asc或desc] 1.查询所有的数据行和列 select * from students 2.查询部分行和列 select 列名  from 表名 where  查询条件表达式 3.在查询中使用列的别名 select scode as 学生编号,sname a

SQL 查询基础(2)-实例

上次说到SQL查询语句的逻辑执行过程,现在来用一个实例说明一下逻辑执行的过程. 前提:我们有三个表,分别记住客户信息.订单信息和产品信息 客户信息表:Customer ID,Name,Adress,PhoneNumber ID Name Adress PhoneNumber 1 CompanyA No.1 Street 123456 2 CompanyB No.2 Street 23453 3 CompanyC No.3 Street 45321 4 CompanyD No.4 Street 4

【知了堂学习笔记】SQL查询基础语句(单表查询、多表查询)

SQL查询基础 1.单表查询 从数据库中查找数据 专业的称谓又称为投影 基本查询语句结构 select 列 from 表 * 所有列不是所有其他东西 查询所有数据 例:SELECT * FROM t_studen 需要执行比较细的操作  加上条件筛选:查询id为2号的学生信息 SELECT * FROM t_student WHERE id=2; 筛选的执行步骤 例:SELECT * FROM t_student WHERE id=2; SELECT *          (3) 再查询  筛选

lucene 转义含有查询关键词的字符的

http://www.oschina.net/question/1092_560 Escaping Special Characters Lucene支持转义查询中的特殊字符,以下是Lucene的特殊字符清单:+ - && || ! ( ) { } [ ] ^ " ~ * ? : \ 转义特殊字符我们可以使用符号“\”放于字符之前.比如我们要搜索(1+1):2,我们可以使用如下语法:\(1\+1\)\:2 lucene自带函数 QueryParser.escape(q)  可转换

T-SQL数据查询基础

一. 数据查询基础 1. 查询所有数据 select * from 表名 2. 根据限制条件查询数据 select * from 表名 where 限制条件 3. 根据特定列进行排序,默认为升序排列 select * from 表名 order by 排序列名 升序/降序 4. 使用别名AS select StudentName as 学生姓名,GradeId as 年级编号 from Student 5. 使用=号命名别名 select 学生姓名=StudentName,年级编号=GradeI

[SQL] SQL 基础知识梳理(二) - 查询基础

SELECT 语句基础 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5904824.html 序 目录 一.SELECT 语句基础 1.查询指定列:SELECT 关键字 --语法: --SELECT <列名>, ... -- 希望查询列的名称 --FROM <表名> -- 指定选取数据的表 -- 从 Shohin 中取 3 列 SELECT shohin_id, shohin_mei, hanbai_tanka -- 列的顺序可以任

S1/C#语言和数据库技术基础/09-数据查询基础

查询的机制: 查询是针对表中已经存在的数据行而言的,可以简单地理解为“筛选”,将符合条件的数据抽取出来. 数据表在接受查询请求的时候,可以简单的理解为“他将逐行判断”,判断是否符合查询条件,如果符合查询条件就提取出来,然后把所有选中的行组织在一起,形成另外一个类似于表的结构,构成查询的结果,通常叫做结果集(RecordSet). 由于结果集的结果实际上和表的结构类似,都是由行组成的,因此在记录集上依然可以进行再次查询. 使用SELECT语句进行查询 查询使用SELECT语句,最简单的查询语句的格