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