在我的 Lucene 文档中,我有一个“公司”字段,其中公司名称被标记化。我需要对我的应用程序的某个部分进行标记化。但对于这个查询,我需要能够在整个公司字段上创建一个 PrefixQuery。

例子:

  • 我的品牌
    • 我的
    • 品牌
  • 婆罗门农场
    • 婆罗门
    • 农场

定期查询“bra”将返回两个文档,因为它们都有一个以 bra 开头的术语。
但我想要的结果只会返回最后一个条目,因为第一个术语以 bra 开头。

有什么建议么?

有帮助吗?

解决方案

用一个 跨度查询 仅搜索第一个术语位置。由 SpanPositionRangeQuery 包装的 SpanMultiTermQueryWrapper 包装的 PrefixQuery:

<SpanPositionRangeQuery: spanPosRange(SpanMultiTermQueryWrapper(company:bra*), 0, 1)>

其他提示

创建另一个索引字段,其中公司名称是 不是 代币化。必要时,搜索该字段而不是标记化的公司名称字段。


如果您想要快速搜索,则需要有直接指向感兴趣记录的索引条目。您可能可以使用邻近数据来过滤记录,但速度会很慢。我认为问题是:如何有效地执行对完整字段的“包含”查询?

您可以通过(为每个当前字段)创建“第一个术语”字段和“剩余术语”字段来最大程度地减少索引大小的增加。这将消除第一个术语在两个字段中的重复。对于“正常”查询,您可以在这些字段中的任一字段中查找查询词。对于“startswith”查询,您仅搜索“第一个术语”字段。但这似乎带来的麻烦多于其价值。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top