当用户在查询中包含时,我正在寻找一种与字段完全匹配的方法。
例如,假设我们有这些文档:
如果用户搜索主题:科学世界,我只想返回doc1,因为它与主题完全匹配。但是,我得到了两个文档。
我尝试使用KeywordAnalyzer为主题编制索引,但是我收到此错误:
java.lang.IllegalStateException: field "subject" was indexed without position data; cannot run Phrase Query
答案 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获取文档列表并消除不符合搜索条件的不需要的文档。