当用户包含在查询中时,我正在寻找一种方法来精确匹配字段。
例如,假设我们有这些文档:
如果用户搜索 subject :science world,我只希望返回doc1,因为它与subject完全匹配。然而,我得到了两个博士。
我尝试用subject索引KeywordAnalyzer,但是我得到了以下错误:
java.lang.IllegalStateException: field "subject" was indexed without position data; cannot run Phrase Query发布于 2014-12-27 10:11:16
"subject“字段的错误可能是因为在索引中没有将项向量存储在字段中(在lucene代码中使用的是StringField还是TextField?)
要存储字段的术语向量,您应该使用lucene的field类,同时将字段使用定义为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获取文档列表,并删除不符合搜索标准的不需要的文档。
https://stackoverflow.com/questions/27663301
复制相似问题