Lucene - 用长串查询

时间:2010-03-23 21:20:57

标签: lucene.net lucene

我有一个索引,其字段为“Affiliation”,一些示例值为:

  • “美国加利福尼亚州帕洛阿尔托斯坦福大学医学院”,
  • “斯坦福大学医学院神经生物学研究所,加利福尼亚州帕洛阿尔托”,
  • “哈佛大学医学院,马萨诸塞州波士顿”,
  • “哈佛大学医学院布里格姆与女子学院,波士顿,马萨诸塞州”
  • “哈佛大学,马萨诸塞州剑桥”

依此类推......(底线是附属关系以多种方式编写,没有明显的一致性)

我使用“医学院,斯坦福大学,加利福尼亚州帕洛阿尔托”(使用QueryParser)查询联盟字段中的索引,以查找所有斯坦福相关文​​档,我得到了很多虚假+ ves,可能是因为医学院等的存在(注意:我不能使用短语查询,因为建立隶属关系的方式不同)

我尝试了以下内容:

  1. 通过将搜索短语与空格分开来使用SpanNearQuery(此处我没有结果!)

  2. 尝试通过用逗号分割来提升(使用^)并使用比初始短语更高的提升来提升诸如“Palo Alto CA”的最后部分。在这里,我仍然会得到很多假的。

  3. 有关如何处理此问题的任何建议?如果SpanNearQuery要走的路,那么为什么我得到0结果的任何想法?

2 个答案:

答案 0 :(得分:1)

您使用OR搜索而不是AND吗?

您可以使用QueryParser.setDefaultOperator()将默认运算符设置为AND。将默认运算符设置为AND应该消除所有误报。但是,如果您的索引值为"Stanford University School of Medicine, Palo Alto, CA ",并且您正在搜索"Stanford University School of Medicine, Palo Alto, CA USA",(请注意查询中的额外术语USA),您可能会面临漏报的风险。

如果您的查询的条款不会超过索引值,则可以解决您的问题。

答案 1 :(得分:0)

我是这样做的:

  1. 在停用词列表中添加了诸如“大学”,“学校”,“医学”,“学院”等常用术语。

  2. 对每个术语使用booleanquery,并将setMinimumNumberShouldMatch()用于查询字符串长度的75%。

  3. 最后,循环访问命中收集器并使用字符串比较算法,如Jaro-Winkler,Levenstein等,用于二级过滤器。 (这很慢但确保精确度)。

    希望这有帮助。