Lucene-查询字段中的多个术语 为简单起见,考虑两个具有以下字段和值的文档: RecordId: "12345" CreatedAt: "27/02/1992" Event: "Manchester, Dubai, Paris" Event: "Manchester, Rome, Madrid" Event: "Madrid, Sidney" RecordId: "99999" CreatedAt: "27/02/1992" Event: "Manchester, Barcelona, Rome" Event: "Rome, Paris" Event: "Milan, Barcelona"

Lucene-查询字段中的多个术语 为简单起见,考虑两个具有以下字段和值的文档: RecordId: "12345" CreatedAt: "27/02/1992" Event: "Manchester, Dubai, Paris" Event: "Manchester, Rome, Madrid" Event: "Madrid, Sidney" RecordId: "99999" CreatedAt: "27/02/1992" Event: "Manchester, Barcelona, Rome" Event: "Rome, Paris" Event: "Milan, Barcelona",lucene,lucene.net,Lucene,Lucene.net,是否可以在“事件”字段的单个实例中搜索多个术语 假设我想搜索“曼彻斯特”和“巴黎”出现在同一领域。 第二条记录包含“Manchester”和“Paris”,但在事件字段的不同实例上,这不应该是resultset的一部分 理想情况下,结果集只能是第一条记录(12345)。如何将事件索引为非标记化字段,然后使用关键字分析器对其进行分析。然后,您可以使用Lucene的匹配曼彻斯特和巴黎的事件: Event: "/^.*(Manchester).+(Paris).*$/" 将事件索引为非标记化字段,然

是否可以在“事件”字段的单个实例中搜索多个术语

假设我想搜索“曼彻斯特”和“巴黎”出现在同一领域。 第二条记录包含“Manchester”和“Paris”,但在事件字段的不同实例上,这不应该是resultset的一部分


理想情况下,结果集只能是第一条记录(12345)。

如何将事件索引为非标记化字段,然后使用关键字分析器对其进行分析。然后,您可以使用Lucene的匹配曼彻斯特和巴黎的事件:

Event: "/^.*(Manchester).+(Paris).*$/"

将事件索引为非标记化字段,然后使用关键字分析器如何。然后,您可以使用Lucene的匹配曼彻斯特和巴黎的事件:

Event: "/^.*(Manchester).+(Paris).*$/"

根据字段使用的分析器(需要标记并删除标点符号)。您可以使用slop短语查询

“曼彻斯特巴黎”~2应该只能找到12345。根据每个字段中值的数量和顺序,您可能需要使用较大的斜率

slop定义了短语上允许匹配的“操作”数。这可以是短语中的重新排序或附加术语

所以“x y”~1可以匹配

  • “y x”
  • “x弗雷德y”
  • 但不是“y fred x”(这需要两个操作:沼泽加上一个附加)

根据您的需要,slop可能应该等于字段中允许的最大项数。我还没有完成它,但我认为即使您查询了2个以上的术语,这也足够了。

取决于您对字段使用的分析器(它需要标记并删除标点符号)。您可以使用slop短语查询

“曼彻斯特巴黎”~2应该只能找到12345。根据每个字段中值的数量和顺序,您可能需要使用较大的斜率

slop定义了短语上允许匹配的“操作”数。这可以是短语中的重新排序或附加术语

所以“x y”~1可以匹配

  • “y x”
  • “x弗雷德y”
  • 但不是“y fred x”(这需要两个操作:沼泽加上一个附加)


根据您的需要,slop可能应该等于字段中允许的最大项数。我还没有完成这项工作,但我认为即使你查询了两个以上的术语,这也足够了。

嘿,鹈鹕。可能会为每个事件字段的每条记录(RecordID)索引一次,并为每条记录的RecordID添加后缀。在您的示例中,您将有六个索引,12345-1。12345-2. 12345-3等等。你最终会得到一个更大的索引,你需要过滤掉重复的点击(例如,如果你也有一个“曼彻斯特、底特律、巴黎”活动),但我认为它会起作用。我明白你的意思,但从长远来看,这种方法最终会让我做噩梦。尽管如此,它还是会起作用的。是的,我没有给出一个正式的答案,因为它看起来很模糊,尽管它会起作用。如果您采用这种方法,请让我知道。@MichaelGorsich只是想跟进您的评论,您将如何在运行时对这些字段执行搜索,而不知道它们的名称值。(例如12345-1、12345-2、12345-3等)?在您的示例中,加上我第一次评论中的一个,对“曼彻斯特”和“巴黎”的结果将得到12345-1和12345-4。首先累积所有结果,然后去掉后缀(LastIndexOf())并消除重复项以将结果减少到12345,因此最终得到一个结果,用于检索文档。嘿,Pelican。可能会为每个事件字段的每条记录(RecordID)索引一次,并为每条记录的RecordID添加后缀。在您的示例中,您将有六个索引,12345-1。12345-2. 12345-3等等。你最终会得到一个更大的索引,你需要过滤掉重复的点击(例如,如果你也有一个“曼彻斯特、底特律、巴黎”活动),但我认为它会起作用。我明白你的意思,但从长远来看,这种方法最终会让我做噩梦。尽管如此,它还是会起作用的。是的,我没有给出一个正式的答案,因为它看起来很模糊,尽管它会起作用。如果您采用这种方法,请让我知道。@MichaelGorsich只是想跟进您的评论,您将如何在运行时对这些字段执行搜索,而不知道它们的名称值。(例如12345-1、12345-2、12345-3等)?在您的示例中,加上我第一次评论中的一个,对“曼彻斯特”和“巴黎”的结果将得到12345-1和12345-4。首先累积所有结果,然后去掉后缀(LastIndexOf())并消除重复项以将结果减少到12345,因此最终得到一个结果,用于检索文档。我不知道slop短语查询。因此,一个包含两个移动的slop查询将在同一个字段中找到所有包含任意给定顺序的术语“manchester”和“paris”的记录。简短回答:是的,正确。我更新了答案,更多地说明了slop的作用。对于一个没有设置最大术语数的字段,将slop设置为int.MaxValue是否有点过分?它会起作用。但不推荐。城市的数量并不是无限的:)对需求的一点分析应该能给出一个合理的上限。我假设这是来自某个数据集。你能把它转过来看看最大值吗?然后再加上一些宽容。我不知道有脏话查询。因此,一个包含两个移动的slop查询将在同一个字段中找到所有包含任意给定顺序的术语“manchester”和“paris”的记录。简短回答:是的,正确。我更新了答案,更多地说明了slop的作用。对于一个没有设置最大术语数的字段,将slop设置为int.MaxValue是否有点过分?它会起作用。但不推荐。城市的数量不是无限的:)应该对需求进行一点分析