一、跨度域查询
基类是:SpanQuery
子类:SpantermQuery; //测试用的这个子类当然还有其他
二、测试
public class SpanTest { Directory dir; IndexWriter writer; IndexReader reader; IndexSearcher search; String[] ceshi; //初始化把索引存在内存中做测试 public void init() throws IOException{ dir=new RAMDirectory(); writer=writer(dir); ceshi=new String[]{"i like you","are you ok"}; } public IndexWriter writer(Directory dir) throws IOException{ Analyzer analyzer=new WhitespaceAnalyzer(Version.LUCENE_42); IndexWriterConfig config=new IndexWriterConfig(Version.LUCENE_42,analyzer); return new IndexWriter(dir, config); } public void createWrite() throws IOException{ for(int i=0;i<ceshi.length;i++){ Document doc=new Document(); doc.add(new TextField("contents",ceshi[i],Store.YES)); writer.addDocument(doc); } writer.close(); } public void test() throws IOException{ reader=DirectoryReader.open(dir); search=new IndexSearcher(reader); SpanTermQuery query=new SpanTermQuery(new Term("contents","you")); Map<Term,TermContext>m=new HashMap<Term,TermContext>(); TermContext termContext=TermContext.build(search.getTopReaderContext(),query.getTerm(),false); m.put(query.getTerm(), termContext); Bits bits = new Bits.MatchAllBits(0); Spans spans=query.getSpans(reader.getContext().leaves().get(0),bits, m); int num=0; System.out.println(query.getTerm()); while(spans.next()){ num++; int id=spans.doc(); Document d=reader.document(id); Analyzer analyzer=new WhitespaceAnalyzer(Version.LUCENE_42); TokenStream ts= analyzer.tokenStream("contents", new StringReader(d.get("contents"))); CharTermAttribute termAttribute = ts.addAttribute(CharTermAttribute.class); ts.reset(); //此行,不能少,不然会报 java.lang.ArrayIndexOutOfBoundsException StringBuffer buffer=new StringBuffer(""); buffer.append(""); int k=0; while(ts.incrementToken()){ if(k==spans.start()){ buffer.append("<"); } buffer.append(termAttribute.toString()); if(k+1==spans.end()){ buffer.append(">"); } buffer.append(" "); k++; } System.out.println(spans.start()+" "+spans.end()); System.out.println(buffer); //if(num==3)break; //break; } if(num==0){ System.out.println("no spans"); } } public static void main(String[] args) throws IOException { SpanTest s=new SpanTest(); s.init(); s.createWrite(); s.test(); } }
运行结果:
最后:
int k=0; while(ts.incrementToken()){ if(k==spans.start()){ buffer.append("<"); } buffer.append(termAttribute.toString()); if(k+1==spans.end()){ buffer.append(">"); } buffer.append(" "); k++; } 但是当用其他的分词器里面的匹配写法就出错了,因为其他分词器可能了一些会分词的时候会根据 需求去掉一些词,例如StopWords或者其他的一些词,而那个匹配是根据从0开始的,所以当用 其他的分词器这个地方不是一个真正的单词位置。
相关推荐
Lucene3.0之查询处理(1):原理和查询类型 各种Query对象详解
lucene 做索引查询流程,来自《lucene in action》
lucene表达式查询示例和表达式语法详解
为了快速查询,加快查询速度,减少与数据库交互,经常需要用到lucene实现创建索引和查询
lucene的查询语法事例.
在Eclipse环境中运用java,Lucene建索引及查询关键字
c#下实现Lucene时间区间查询匹配。主要还是对Lucene查循对像Query的实现
Lucene实现索引和查询的实例讲解Lucene实现索引和查询的实例讲解
而我们可以将这两种方式结合下,每次查询都多缓存一部分的结果集,翻页的时候看看所查询的内容是不是在已经存在在缓存当中,如果已经存在了就直接拿出来,如果不存在,就进行查询后,从缓存中读出来. 比如:现在我们有一个...
NULL 博文链接:https://navylee.iteye.com/blog/740128
基于lucene3.0 书籍查询系统 基于lucene3.0 书籍查询系统
Lucene分词与查询详解。这是一个完整的实例,希望对大家的开发学习有帮助!!!
Directory类代表一个Lucene索引的位置。它是一个抽象类. 其中的两个实现: 第一个是 FSDirectory,它表示一个存储在文件系统中的索引的位置。 第二个是 RAMDirectory,它表示一个存储在内存当中的索引的位置。 ...
该程序代码属于本人2015所写,虽然尚有不足,却实现了对多个文件夹下的数据进行Lucene建立索引和查询功能,并包含了所需的所有jar包,工程直接导入即可运行。
lucene facet查询示例,区间查询多dim查询,key-field-value模型了解
lucene实例lucene实例lucene实例lucene实例lucene实例lucene实例lucene实例lucene实例lucene实例
spark-lucenerdd, 使用Lucene功能的查询来激发 RDD lucenerdd 使用 Apache Lucene的RDD x Spark x Spark 。主要抽象是特殊类型的RDD 调用 LuceneRDD 。FacetedLuceneRDD 和 ShapeLuceneR
lucene 实现某市公交路线查询系统 技术:lucene,xml,jxl,dom4j
Lucene创建索引,查询索引的简单使用。
对Lucene内部的相似度评分算法进行研究分析后,针对Lucene只关心查询词出现的频率,而不关心它们所在的位置这一缺陷提出了一种改进的算法。改进的算法将词语位置关系特征融合到Lucene原始相似度评分算法中。在TREC...