lucene过滤索引
『壹』 请教lucene indexsearcher查询后不关闭引起的索引问题
看一下是不是建索引的问题(Field选取的不对,一般id字段用Field.Index.NOT_ANALYZED),
我用lucene 3.6.2, IKAnalyzer2012_u6.jar测试的
import java.io.File;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import 搜索org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.queryParser.MultiFieldQueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;
import org.wltea.analyzer.lucene.IKAnalyzer;
public class LucenDemo {
public static void main(String[] args) {
String id = "456";
createIndex();
printTotalHits(id);
deleteById(id);
printTotalHits(id);
}
static String indexPath = "E:\\lucene-demo-index\\";
public static void printTotalHits(String id) {
try {
Analyzer anal = new IKAnalyzer(true);
MultiFieldQueryParser parser = new MultiFieldQueryParser(Version.LUCENE_36, new String[] {"id"}, anal);
Query query = parser.parse(id);
Directory dir = FSDirectory.open(new File(indexPath));
IndexReader indexReader = IndexReader.open(dir);
IndexSearcher searcher = new IndexSearcher(indexReader);
System.out.println(searcher.search(query, 10).totalHits);
indexReader.close();
} catch(Exception e) {
e.printStackTrace();
}
}
public static void deleteById(String id) {
try {
Analyzer anal = new IKAnalyzer(true);
MultiFieldQueryParser parser = new MultiFieldQueryParser(Version.LUCENE_36, new String[] {"id"}, anal);
Query query = parser.parse(id);
Directory dir = FSDirectory.open(new File(indexPath));
IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_36,anal);
IndexWriter indexWriter = new IndexWriter(dir, config);
indexWriter.deleteDocuments(query);
indexWriter.commit();
indexWriter.close();
} catch(Exception e) {
e.printStackTrace();
}
}
public static void createIndex() {
try {
Analyzer analyzer = new IKAnalyzer(true);
Directory dir = FSDirectory.open(new File(indexPath));
IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_36, analyzer);
IndexWriter indexWriter = new IndexWriter(dir, config);
Document doc1 = new Document();
doc1.add(new Field("id", false, "123", Field.Store.YES, Field.Index.NOT_ANALYZED, Field.TermVector.NO));
indexWriter.addDocument(doc1);
Document doc2 = new Document();
doc2.add(new Field("id", false, "456", Field.Store.YES, Field.Index.NOT_ANALYZED, Field.TermVector.NO));
indexWriter.addDocument(doc2);
Document doc3 = new Document();
doc3.add(new Field("id", false, "789", Field.Store.YES, Field.Index.NOT_ANALYZED, Field.TermVector.NO));
indexWriter.addDocument(doc3);
indexWriter.commit();
indexWriter.close();
} catch(Exception e) {
e.printStackTrace();
}
}
}
『贰』 lucene对数据库表建索引、索引更新及检索,需考虑一对多、多对多等关系,最后检索结果同行显示,如何实现
建立视图v(a_id,b_id,a2,a3,b2,b3),然后再根据v去建立索引
『叁』 使用 lucene 进行全文检索,先建索引在搜索,求高手
修改queryByCondition方法:
public static List queryByCondition(String indexFile, String field, String queryString, int count){
List list = null;
Query querytemp=null;
Query query=new BooleanQuery();
try{
IndexReader reader = DirectoryReader.open(FSDirectory.open(new File(
indexFile)));
IndexSearcher searcher = new IndexSearcher(reader);
Analyzer analyzer = new IKAnalyzer();
Analyzer standardanalyzer=new StandardAnalyzer();
QueryParser parser = new QueryParser(Version.LUCENE_40, field,
analyzer);
querytemp = parser.parse(queryString);
parser=new QueryParser(Version.LUCENE_40, field,
standardanalyzer);
query.add(querytemp,parser.parse(queryString,should);
if(queryString.indexof("?")!=0||queryString.indexof("*")!=0){
query.add(new wildcardQuery(queryString),should);
System.out.println("Searching for: " + query.toString(field));
list = doSearch(searcher, query, count);
reader.close();
}catch(Exception e){
}
return list;
}
随便写的,不知道可不可以。
『肆』 lucene检索,必须完全包含我筛选的关键字,只包含其中一个字的要过滤掉,怎么设置
这个要看你的搜索关键词是什么,采用的分词器是什么,比如你搜索的关键词是“搜索引擎内”,如果容采用的分词器的分词结果就包含“搜索引擎‘这个词,那么采用TermQuery就可以了;如果采用的分词器的分词结果不是“搜索引擎‘这个词,而是”搜索“和”引擎“这两个词,那么要采用PhraseQuery,setSlop(0),这样就可以搜索出同时包含”搜索“和”引擎“这两个词并且这两个词紧挨着的所有文章了。
『伍』 lucene删除索引的问题
直接删除其中一条数据库记录是指手动去数据库删除?
如果是这样你只能做个定时器,例如每天晚上12点去重新生成lucene索引
如果不是而是通过程序来作就很简单啊,删除oracle数据的时候根据id去删掉
lucene的索引就可以了,注意生成索引的时候id要设为untoken才找的到
另外你为什么不跳出这个思路呢?在查询的时候来判断数据库有没有这个值不可以么?把这个异常抓到就直接提示不存在不就可以了
『陆』 lucene中分词和索引的区别
ucene中分词和索引的区别如下:
1、分词器,对文本资源进行切分,将字符文本串按照一定的规则切分为一个个可以进行索引的最小单位(关键词),以便检索时使用。
『柒』 用lucene创建索引后,在模糊匹配查询出一千条数据后,该如何自定义查询条数。只显示前一百条数据呢。
SortField sortFieldByScore = new SortField(null, SortField.SCORE);
TopFieldCollector tfc = TopFieldCollector.create(new Sort(new SortField[] { sortFieldByScore }), 100, true, true, true, false);
searcher.search(output, tfc);//searcher是IndexSearcher对象
TopDocs results = tfc.topDocs();
『捌』 lucene搜索的时候可以去掉重复的索引只取一条吗
这个可能抄是对数据库里的同一条记录建了多次索引就出现重复的了。 maxrocray 写道 理论上当然是可以的。 不过你要写个比较复杂的filter,对重复的索引的那个不同的field进行过滤。 过滤的规则,我想会根据你这个重复的索引的情况而定,可能会很复杂。 所以,常规来说,我们会对索引进行优化和整理,不允许重复的索引。
『玖』 [lucene]如何避免重复索引文件的方案
大概明白了,但这样可以避免重复索引,可避免不了服务器上被上传了重复的原始文件,稍稍是个遗憾吧。
『拾』 海量数据环境下,Lucene 的索引性能如何优化
很多人会抱怨 Lucene 在数据量增加到一定规模的时候,性能会出现明显下降,对于并发用户访问的支持能力也比较弱。其实在工程师所遇到的绝大多数环境下 Lucene 的性能问题,往往是因为系统没有经过良好的调优。而非简单的 Lucene 设计缺陷所造成。 当前使用 Lucene 的知名网站包括,Stack Exchange,旗下全球最大的事实性问答网站 StackOverFlow.com . 基于Lucene 文档 “How to make indexing faster”,我们可以看到如下经验可能可以应用于 Lucene 优化。 确定的确需要进行索引性能调优很多场景之下,性能问题其实表现为整体数据架构设计的问题,而不仅仅是通过索引所可以解决的。在决定进行索引性能调优之前,可能需要首先判断,是否数据架构上出现了情况。 确定在使用最新版本的LuceneLucene也是在不断发展之中。新版本的Lucene通常性能都会有些改善。 使用更快的硬件,例如,改善IO系统性能通常硬件性能的改善对于系统整体性能提升是立竿见影的。例如,通过SSD硬盘(Solid-State Disk,固态硬盘)取代通常的 SATA 或者 SAS 硬盘,将可以获得明显的系统性能提升。 在建立索引过程中,使用单例的 Writer基于内存执行 Flush 而不是基于 document count在Lucene 2.3 及其以上系统中,IndexWriter可以基于内存执行Flush操作。调用 writer.setRAMBufferSizeMB() 可以设置Buffer大小。 尽量多使用内存内存越多,Lucene应对海量数据的时候性能明显加强。 关闭复合文件格式(Compound file format)调用setUseCompoundFile(false),可以关闭。建立复合文件,将可能使得索引建立时间被拉长,有可能达到7%-33%。而关闭复合文件格式,将可能大大增加文件数量,而由于减少了文件合并操作,索引性能被明显增强。 重用文档与字段实例这是在 Lucene 2.3 之后才有的一个新技术。在之前如果要修改某个记录,需要删除掉索引中的文档,然后重新添加。而新的方法通过 setValue 实现。这将有助于更有效的减少GC开销而改善性能。 在存储字段数据以及执行 term vectors 的时候,使用同样的字段顺序添加文档这样将有助于保证合并操作的性能。 在打开 IndexWriter 的时候,设置 autoCommit = false同传统的数据库操作一样,批量提交事务性能总是比每个操作一个事务的性能能好很多。 同样,对于实时性要求不是很强的系统。通过标记,并定时进行索引和优化,也将比随时进行索引操作性能能改善很多。 不要使用太多的小字段,如果字段过多,尝试将字段合并到一个更大的字段中,以便于查询和索引适当增加 mergeFactor,但是不要增加的太多。关闭所有不需要的特性使用更快的 Analyzer特别是对于中文分词而言,分词器对于性能的影响更加明显。 加快文档的构造速度通常,从数据库,文件系统,或者网络爬行过程中,都可能因为上游程序处理的性能而影响 Lucene 文档建立的速度。 除非真的需要改善索引性能,通常不要特别进行优化对于一个实例的 IndexWriter 可以使用多线程或者并发技术使用Java Profiler分析 Lucene 和调用程序的性能,并由此改善性能Index into separate indices then merge.If you have a very large amount of content to index then you can break your content into N "silos", index each silo on a separate machine, then use the writer.addIndexesNoOptimize to merge them all into one final index.