Lucene查询中的精确字段匹配

时间:2014-12-27 00:25:32

标签: java lucene

当用户在查询中包含时,我正在寻找一种与字段完全匹配的方法。

例如,假设我们有这些文档:

  • Doc 1:catchall:" hello world",subject:" science"
  • Doc 2:catchall:"再见世界",主题:"生命科学"

如果用户搜索主题:科学世界,我只想返回doc1,因为它与主题完全匹配。但是,我得到了两个文档。

我尝试使用KeywordAnalyzer为主题编制索引,但是我收到此错误:

java.lang.IllegalStateException: field "subject" was indexed without position data; cannot run Phrase Query

1 个答案:

答案 0 :(得分:0)

"主题"的错误字段可能是因为你没有在索引中存储你的字段的术语向量(你在你的lucene代码中使用StringField或TextField吗?)

要存储字段的术语向量,您应该使用lucene的Field类,同时将Field use定义为FieldType

    FieldType fieldType = new FieldType();
    fieldType.setStoreTermVectors(true);
    fieldType.setStoreTermVectorPositions(true);
    fieldType.setIndexed(true);
    fieldType.setIndexOptions(IndexOptions.DOCS_AND_FREQS);
    fieldType.setStored(true);

添加具有以上字段的文档

doc.add(new Field("field_name", "data", fieldType));

现在第一个问题,我可以想到两种方式

1)实现自定义相似性 - 您可以创建从默认相似性派生的新相似度类并更改lenghtNorm方法,以便您将文档优先于"科学"更多的是生命科学",怎么样?根据比率(来自查询的匹配术语/文档中的总术语)对每个文档进行评分。正如您所看到的那样,较短且更相关的文档将以上述比率得分更高。

2)后处理lucene返回文档以消除不需要的文档(不太推荐) - 从Lucene获取文档列表并消除不符合搜索条件的不需要的文档。