Tag: lucene

如何使用多字段查询?

http://lucene.apache.org/java/2_3_1/api/core/org/apache/lucene/search/MultiPhraseQuery.html 对于示例“Microsoft app *”,他说使用IndexReader.term()但返回TermEnum ,我如何将它放在MultiPhraseQueryParser ? 编辑: 或者有人告诉我如何以更好的方式在7.5 GB的索引上搜索Microsoft app * !

FieldCache经常更新索引

你好 我有经常用新记录更新的lucene索引,我的索引中有5,000,000条记录,并且我使用FieldCache缓存了我的一个数字字段。 但是在更新索引后需要时间再次重新加载FieldCache(重新加载缓存导致文档说DocID不可靠)所以如何通过向FieldCache添加新添加的DocID来最小化这种开销,导致此function转为我的瓶颈应用。 IndexReader reader = IndexReader.Open(diskDir); int[] dateArr = FieldCache_Fields.DEFAULT.GetInts(reader, “newsdate”); // This line takes 4 seconds to load the array dateArr = FieldCache_Fields.DEFAULT.GetInts(reader, “newsdate”); // this line takes 0 second as we expected // HERE we add some document to index and we need to reload the index to reflect changes reader = […]

使用CharFilter和Lucene 4.3.0的StandardAnalyzer

我正在尝试将CharFilter添加到我的StandardAnalyzer 。 我的目的是从我索引的所有文本中删除标点符号; 例如,我想要一个PrefixQuery“pf”匹配“PF Chang”或“zaras”以匹配“Zara”。 似乎这里最简单的攻击计划是在分析之前过滤掉所有标点符号。 根据Analyzer包文档 ,这意味着我应该使用CharFilter 。 然而,实际上几乎不可能将CharFilter插入分析仪中! Analyzer.initReader的JavaDoc说“如果要插入CharFilter,则覆盖它”。 如果我的代码扩展了Analyzer,我可以扩展initReader但是我不能将抽象的createComponents委托给我的基础StandardAnalyzer,因为它受到保护。 我不能将tokenStream委托给我的基础分析器,因为它是最终的。 因此,Analyzer的子类似乎无法使用另一个Analyzer来完成其脏工作。 有一个AnalyzerWrapper类似乎是我想要的完美! 我可以提供一个基础分析器,只覆盖我想要的部分。 除了… initReader已经被覆盖以委托给基础分析器,并且这个覆盖是“最终的”! 坏消息! 我想我可以让我的Analyzer在org.apache.lucene.analyzers包中然后我可以访问受保护的createComponents方法,但这似乎是一种令人厌恶的hacky方式绕过我真正应该使用的公共API。 我错过了一些明显的东西吗? 如何修改StandardAnalyzer以使用自定义CharFilter ?

一起使用Solr和Zends Lucene端口

下午的家伙, 在我使用Zend-Lucene-Search进行冒险之后,发现它并不是在为大型数据集编制索引时,我已经转向Solr(感谢Bill Karwin 🙂 我现在已经让Solr将数据库编入索引的速度远远超过了8分钟就可以为一个超过170万行的表编制索引 – 这让我非常满意。 但是,当我尝试使用Zend端口搜索索引时,我遇到以下错误; 致命错误:/var/www/Zend/Search/Lucene.php:407中未捕获的exception’Zend_Search_Lucene_Exception’,消息’不支持的段文件格式’堆栈跟踪:#0 /var/www/Zend/Search/Lucene.php(555 ):Zend_Search_Lucene – > _ readSegmentsFile()#1 /var/www/z_search.php(12):Zend_Search_Lucene – > __ construct(’tmp / feeds_index’)在#var / www / Zend / Search / Lucene中抛出#2 {main} .php在407行 我试图搜索一下但似乎无法找到关于这个问题的任何内容,每个人似乎都能够让他们工作? 任何帮助,因为总是非常感谢:) 谢谢, 汤姆

如何只标记Lucene中的某些单词

我正在将Lucene用于我的项目,我需要一个自定义分析器。 代码是: public class MyCommentAnalyzer extends Analyzer { @Override protected TokenStreamComponents createComponents( String fieldName, Reader reader ) { Tokenizer source = new StandardTokenizer( Version.LUCENE_48, reader ); TokenStream filter = new StandardFilter( Version.LUCENE_48, source ); filter = new StopFilter( Version.LUCENE_48, filter, StandardAnalyzer.STOP_WORDS_SET ); return new TokenStreamComponents( source, filter ); } } 我已经建成了它,但现在我无法继续下去。 我的需求是filter必须只选择某些单词。 与使用停用词相比,相反的过程:不要从词列表中删除,而只添加词汇表中的术语。 像一个预建的字典。 所以StopFilter没有填满目标。 […]

Lucene:如何在几个独立的索引集上执行搜索并合并结果?

现在我有几个Lucene索引集(我称之为分片),它索引不同的文档集。 它们是独立的,这意味着我可以在不阅读其他内容的情况下对每个进行搜索。 然后我收到一个查询请求。 我想在每个索引集上搜索它,并将结果组合起来形成最终的顶级文档。 我知道在对文档进行评分时,Lucene需要知道每个术语的< idf >,不同的索引集会给同一个术语提供不同的< idf >(因为不同的索引集包含不同的文档集)。 因此,据我所知,我无法直接比较不同索引集的文档得分。 那么我应该如何生成最终结果呢? 一个明显的解决方案是首先合并索引,然后对大索引执行搜索。 然而,这对我来说太耗费时间,因此是不可接受的。 谁有其他更好的解决方案? PS:除了Lucene和Hadoop之外,我不想使用任何软件包或软件(如Katta)。

有没有人知道如何使用带有Lucene 3.6的Wordnet扩展查询?

我在org.apache.lucene.analysis.synonym中找到了WordnetSynonymParser类,但是在API和谷歌中都没有使用它的例子。 有人有经验吗? 谢谢! 编辑 :我知道曾经有类SynExpand ,但是版本3.6它消失了…… 我试试: try { FileReader rulesReader = new FileReader(“wn/wn_s.pl”); SynonymMap.Builder parser = null; parser = new WordnetSynonymParser(true, true, analyzer); ((WordnetSynonymParser)parser).add(rulesReader); synonymMap = parser.build(); } catch (Exception e) { e.printStackTrace(); System.exit(1); } 但是我收到以下错误: java.text.ParseException: Invalid synonym rule at line 109 at org.apache.lucene.analysis.synonym.WordnetSynonymParser.add(WordnetSynonymParser.java:75) at pirServer.QueryClassifier.(QueryClassifier.java:77) at pirServer.PIRServer.main(PIRServer.java:32) Caused by: java.lang.IllegalArgumentException: term: course […]

如何进行多字段 – 在Lucene中进行短语搜索?

标题要求一切……我想在Lucene做一个多字段 – 短语搜索..怎么做? 例如:我有String s[] = {“title”,”author”,”content”};作为String s[] = {“title”,”author”,”content”}; 我想在所有领域搜索harry potter ..我该怎么办? 有人可以提供一个示例代码段吗?

Java线程在处理结束时变慢

我有一个Java程序,它接收一个包含文本文件列表的文本文件,并分别处理每一行。 为了加快处理速度,我使用带有24个线程的FixedThreadPool的ExecutorService来使用线程。 该机器有24个内核和48GB内存。 我正在处理的文本文件有250万行。 我发现,对于前230万行左右,CPU运行率很高,运行良好。 然而,超过某些点(大约在2.3行),性能退化,只使用了一个CPU,我的程序几乎停止了。 我调查了很多原因,确保关闭所有文件句柄,并增加提供给JVM的内存量。 但是,无论我改变什么,性能总是会降低到最后。 我甚至尝试过包含更少行的文本文件,并且在处理文件结束时性能再次下降。 除了标准的Java并发库之外,代码还使用Lucene库进行文本处理和分析。 当我没有线程化这个代码时,性能是恒定的,并且不会在最后退化。 我知道这是一个黑暗的镜头,很难描述发生了什么,但我想我会看到是否有人有任何想法可能会导致这种性能退化到底。 编辑 在我收到的评论之后,我在这里粘贴了一个堆栈跟踪。 如您所见,它看起来好像没有任何线程阻塞。 此外,在分析时,当事情变慢时,GC不是100%。 实际上,大多数时候CPU和GC的利用率都是0%,CPU偶尔会出现一些文件,然后再次停止。 执行线程的代码 BufferedReader read = new BufferedReader(new FileReader(inputFile)); ExecutorService executor = Executors.newFixedThreadPool(NTHREADS); String line; while ((line = read.readLine()) != null) { //index each line Runnable worker = new CharikarHashThreader(line, bits, minTokens); executor.execute(worker); } read.close();

为什么Lucene不支持对现有文档的任何类型的更新

我的用例涉及索引Lucene文档,然后在以后的多个场合添加指向此现有文档的术语,即不删除和重新添加每个新术语的整个文档(因为性能,而不是保留原始术语)。 我知道文档无法真正更新。 我的问题是为什么? 或者更确切地说,为什么不支持所有forms的更新(术语,存储字段)? 为什么不可能添加另一个术语来指向现有文档 – 从技术上讲:并非所需要的只是将现有文档ID放在术语的发布列表中。 为什么那么难? 是否存在一些不可变的统计数据? 是否有任何变通方法可以支持我在现有文档中添加术语(索引字段)的用法?