Tag: lucene.net

在ASP.NET MVC站点中正确构建Lucene.Net用法

我正在构建一个ASP.NET MVC站点,我计划使用Lucene.Net。 我已经设想了一种构建Lucene使用方法的方法,但不确定我的计划架构是否正常且高效。 我的计划: 在Global.asax中的Application_Start事件:我检查文件系统上是否存在索引 – 如果它不存在,我创建它并用从数据库中提取的文档填充它。 提交新内容时:我创建一个IndexWriter ,填写文档,写入索引,最后处理IndexWriter 。 IndexWriters没有被重用,因为我无法想象在ASP.NET MVC应用程序中这样做的好方法。 编辑内容时:我重复与提交新内容时相同的过程,但我先删除旧内容然后添加编辑。 当用户搜索内容时:我检查HttpRuntime.Cache以查看用户是否已在过去5分钟内搜索过该术语 – 如果有,我会返回这些结果; 否则,我创建一个IndexReader ,构建并运行一个查询,将结果放入HttpRuntime.Cache ,将它们返回给用户,最后处理IndexReader 。 再一次, IndexReaders不会被重用。 我的问题: 这是一个很好的结构 – 我怎样才能改进它? 我应该注意哪些性能/效率问题 ? 另外,是不是重复使用IndexReaders和IndexWriters一个巨大的代码味道?

如何使用Lucene.Net查询集合中的术语,类似于SQL的IN运算符?

我们正在尝试搜索文档在可能值的集合中是否具有特定字段值, field:[value1, value2, value3, …, valueN] 如果它匹配任何输入值,它将返回该元素,类似于SQL的IN()运算符。 这类似于range查询,但元素不一定描述范围。 使用Lucene.Net API的一个例子是, var query = new QueryParser(version, “FieldName”, analyzer).In(“value1”, “value2”, “value3”); 这在Lucene.Net中是否可行?

Lucene.net范围查询+突出显示

还有一个极端新手的另一个Lucene.net问题。 这一次,我发现使用包含范围和使用突出显示的查询时会遇到一个有趣的问题。 我是从内存中写的,所以请原谅任何语法错误。 我有一个假设的Lucene索引: ——————————————————— | date | text | ——————————————————— | 1317809124 | a crazy block of text | ——————————————————— | 1317809284 | programmers are crazy | ——————————————————— ** date is a unix timestamp …并且它们已经通过以下方式添加到索引中: Lucene.Net.Documents.Document doc = new Lucene.Net.Documents.Document(); doc.Add(new Lucene.Net.Documents.Field(“text”, “some block of text”, Lucene.Net.Documents.Field.Store.YES, Lucene.Net.Documents.Field.Index.ANALYZED, Lucene.Net.Documents.Field.TermVector.WITH_POSITIONS_OFFSETS)); doc.Add(new Lucene.Net.Documents.Field(“date”, “some unix timestamp”, […]

如何使用Lucene.net实现自定义filter?

下面的代码来自Lucene In Action一书(最初是Java)。 它用于构建“允许”文档列表(从用户权限的角度来看)以过滤搜索结果。 问题是termsDocs.Read()方法不接受’doc’和’freq’数组通过引用传递,所以它们在设置位数组中的位时仍然是空的。 任何人都可以提供帮助,使用Lucene自定义filter(尤其是.net)的例子似乎很薄。 谢谢。 public class LuceneCustomFilter : Lucene.Net.Search.Filter { string[] _luceneIds; public LuceneCustomFilter(string[] luceneIds) { _luceneIds = luceneIds; } public override BitArray Bits(Lucene.Net.Index.IndexReader indexReader) { BitArray bitarray = new BitArray(indexReader.MaxDoc()); int[] docs = new int[1]; int[] freq = new int[1]; for (int i = 0; i < _luceneIds.Length; i++) { if […]

为什么filter不能在Lucene.Net中使用文本/字符串值?

我在Lucene.Net中制作了一个filter来限制搜索结果。 我遇到了一个非常奇怪的问题。 filter不使用文本值,但使用数字值。 例如: 如果我正在使用数字值进行过滤,如下所示。 它工作得很好。 String field = “id”; Filter LE= new QueryWrapperFilter(new TermQuery( new Term(field, “1234567”))); indexSearcher.Search(QueryMaker(searchString, searchfields), LE, coll); 但是,如果我给出一个包含Text的值 String field = “id”; Filter LE = new QueryWrapperFilter(new TermQuery(new Term(field, “ZZZOCB9X9Y”))); indexSearcher.Search(QueryMaker(searchString, searchfields), LE, coll); 它失败了。 结果不显示任何记录。 有人可以解释我的问题。 另外,我已经多次测试过这个说法。 我在一些论坛上看到,3以下Lucene版本中的术语查询可能会出现此问题。 但是,我已将版本更改为3.0.3,但错误仍然存​​在。 我非常需要我的程序中的filter才能工作。 否则我将不得不离开Lucene并找到别的东西。

我如何实现标签搜索? 与lucene?

我还没用过lucene。 上次我问(几个月前,也许一年),人们建议使用lucene。 如果我不应该使用lucene我应该使用什么? 例如,有些标记的项目是这样的 苹果胡萝卜 苹果 萝卜 苹果香蕉 如果一个用户搜索苹果我不在乎是否有1,2和4的任何偏好。但是我看到很多论坛这样做我讨厌当用户搜索苹果胡萝卜2和3有高结果而1很难找到甚至虽然它更贴近我的搜索。 此外,我希望能够搜索胡萝卜 – 苹果只能得到我3.我不知道如果我搜索胡萝卜香蕉会发生什么,但不管怎样,只要更多的项目标记为2和3的结果是较低的排名然后1我搜索苹果胡萝卜,我会很高兴。 lucene可以这样做吗? 我从哪里开始? 我尝试查找它,当我看到很多课程时,我会看到有关文档,网页的教程,但是当我喜欢标记某些内容时,没有人明白该做什么。 如果不是lucene我应该用什么标记?