代码之家  ›  专栏  ›  技术社区  ›  berko

Lucene中的查询类型

  •  2
  • berko  · 技术社区  · 14 年前

    卢森诺布警报!

    我认为自己至少是一个有合理智力的人,但是我在Lucene中摸索查询类型时遇到了巨大的问题。

    在我的特定实例中,我需要在我的文档中搜索一个只有moedrate长度(平均大约50个字符)的字符串字段。

    我希望用户能够在他们搜索的项目中键入单词的开头。而且我也不想强迫他们提供条款的顺序。

    示例字段:“通用品牌实力”

    “通用品牌实力” “品牌通用实力” ... “gen bran街” “普通str” ... 等。

    如果有帮助的话,我可以将我的信息(示例中的每个单词)存储在不同的字段中,但我不相信这会有帮助。

    我现在迷失在一个模糊的通配符和多术语短语的世界里。

    顺便说一句,我正在使用Lucene 2.9,但我认为这并不重要。

    1 回复  |  直到 14 年前
        1
  •  4
  •   Mikos    14 年前

    不需要将每个术语存储在单独的字段中。Lucene从每个词中创建标记(如果您使用的是空白标记器),因此允许极大的搜索灵活性。

    关于你的问题:

    示例字段:“通用品牌 “力量”

    实力“品牌通用实力”

    上面的查询将返回两个结果,后者由于明显的原因得分较低。但是,“gen bran str”“bran generic str”。。。等是棘手的,因为它似乎不是标准的术语“茎”,在这种情况下,你可以使用词干分析器。

    1. 将查询短语除以空格,这样就有了一个字符串[]
    2. 使用Booleanquery并为每个术语创建一个查询,并在末尾附加一个通配符。

    比如:

    string[] terms = query.split(" ");
    BooleanQuery bq = new BooleanQuery();
    
    foreach(string term in terms)
     bq.Add(new Query("FieldName", term + "*",...);
    

    有更好的查询类型,如SpanQuery、DisMax等,但是由于您提到了noob警报,因此认为上面的方法是最简单的(尽管可能不是最优雅的)方法。