题
在我的 Lucene 文档中,我有一个“公司”字段,其中公司名称被标记化。我需要对我的应用程序的某个部分进行标记化。但对于这个查询,我需要能够在整个公司字段上创建一个 PrefixQuery。
例子:
- 我的品牌
- 我的
- 品牌
- 婆罗门农场
- 婆罗门
- 农场
定期查询“bra”将返回两个文档,因为它们都有一个以 bra 开头的术语。
但我想要的结果只会返回最后一个条目,因为第一个术语以 bra 开头。
有什么建议么?
解决方案
用一个 跨度查询 仅搜索第一个术语位置。由 SpanPositionRangeQuery 包装的 SpanMultiTermQueryWrapper 包装的 PrefixQuery:
<SpanPositionRangeQuery: spanPosRange(SpanMultiTermQueryWrapper(company:bra*), 0, 1)>
其他提示
创建另一个索引字段,其中公司名称是 不是 代币化。必要时,搜索该字段而不是标记化的公司名称字段。
如果您想要快速搜索,则需要有直接指向感兴趣记录的索引条目。您可能可以使用邻近数据来过滤记录,但速度会很慢。我认为问题是:如何有效地执行对完整字段的“包含”查询?
您可以通过(为每个当前字段)创建“第一个术语”字段和“剩余术语”字段来最大程度地减少索引大小的增加。这将消除第一个术语在两个字段中的重复。对于“正常”查询,您可以在这些字段中的任一字段中查找查询词。对于“startswith”查询,您仅搜索“第一个术语”字段。但这似乎带来的麻烦多于其价值。
不隶属于 StackOverflow