gpt4 book ai didi

java - 在Lucene中嵌套搜索而不重复关键字

转载 作者:行者123 更新时间:2023-12-01 15:41:13 26 4
gpt4 key购买 nike

我想使用以下逻辑在Lucene(实际上是Lucene.NET,但是我可以根据需要从Java转换)中进行搜索:


搜索字符串是:A B C
在索引的一个字段中搜索与A,B或C匹配的任何内容。(查询:(field1:A field1:B field1:C)
对于在步骤2中不匹配的每个术语,请在第二个字段中进行搜索,同时保留第一次搜索的结果(查询:(+(field1:A) +(field2:B field2:C))
对于第3步中不匹配的每个术语,请搜索第三个字段...
继续操作,直到用完所有字段,或者搜索已使用了所有术语。


目前,我的代码可以测试给定的搜索是否未产生结果,并将所有确实产生结果的结果与在一起。但是我没有办法在针对每个字段进行测试之前停止它(这不必要地限制了结果)-当前它以诸如(+(field1:A field1:B field1:C) +(field3:A field3:B field3:C))的查询结尾,当我希望它为(+(field1:A field1:C) +(field3:B))时。我不能只看第一次搜索的结果并从搜索字符串中删除单词,因为分析器在解析单词进行搜索时会对其进行修饰,并且我无法解开它们以找出原始单词中的哪个它所对应的搜索词。

有什么建议么?



编辑:
好的,总的来说,我更喜欢抽象地描述我的问题,但是我认为其中的某些部分会在过程中迷路,因此我将更加具体。

我正在为一个需要具有多层搜索逻辑的站点构建搜索引擎。我将跟踪的一些示例搜索为:


头戴式耳机
怪兽耳机
白色Monster耳机
白色Foobar耳机


该索引包含具有七个字段的文档-与该示例相关的是:


“ datattype”:一个字符串,代表此文档代表的项目类型(产品,类别,品牌),因此我们知道如何显示它
“品牌”:相关的品牌(类别有多个品牌,产品和品牌各有一个)
“路径”:给定类别的路径(即“音频>耳机>入耳”的“入耳式音频耳机”)
“关键字”:描述产品的各种内容,在其他任何地方都没有。


通常,搜索的每个步骤的逻辑如下:


检查我们是否有匹配项。
如果是这样,请根据该匹配项过滤结果,然后在下一步中继续解析其余的搜索词。
如果不是,请在下一步中解析搜索词。


每个步骤都类似于:


搜索类别
搜寻品牌
搜索关键词


因此,这三个示例搜索应如何显示:


头戴式耳机


搜索类别:+path:headphones +datatype:Category
存在匹配项(“耳机”类别),并且原始查询中没有剩下任何单词,因此我们将其返回。

怪兽耳机


搜索类别:`+(path:monster path:headphones)+ datatype:Category
找到了path:headphonesdatatype:Category的匹配项,而“ Monster”不匹配
搜索品牌:+path:headphones +brand:monster
找到了path:headphonesbrand:monster的匹配项,原始查询中没有留下任何单词,因此我们退回Monster的所有耳机​​。

白色Monster耳机


搜索类别:+(path:monster path:headphones path:white) +datatype:Category
找到了path:headphonesdatatype:Category的匹配项,“白色”和“怪物”不匹配
搜索品牌:+path:headphones +(brand:monster +brand:white)
找到了path:headphonesbrand:monster的匹配项,而“白色”不匹配
搜索关键字:+path:headphones +brand:monster +keywords:white
有匹配项,并且没有原始查询中的任何单词,因此我们将其返回。

白色Foobar耳机


搜索类别:+(path:foobar path:headphones path:white) +datatype:Category
找到了path:headphonesdatatype:Category的匹配项,而“ White”和“ Foobar”不匹配
搜索品牌:+path:headphones +(brand:foobar +brand:white)
找不到任何内容,因此我们继续。
搜索关键字:+path:headphones +(keywords:white keywords:foobar)
找到了path:headphoneskeywords:white的匹配项,而“ Foobar”不匹配
...(继续搜索其他字段,包括产品说明)...
尚有不匹配的搜索字词(“ Foobar”),返回“未找到结果”



我有两个问题:


我不希望所有内容都匹配后匹配就继续(只有产品才有描述,所以一旦到达这一步,我们将永远不会返回不是产品的东西)。我可以通过使用here中的denis的GetHitTerms来解决此问题,除了我然后最终在所有后续字段中搜索第一个匹配的术语,直到一切都匹配为止(例如,在示例#2中,我将使用+path:headphones +(brand:headphones brand:monster))。
尽管上面有我的示例,但我在path字段上的实际搜索查询看起来像+path:headphon +datatype:Taxonomy,因为我正在处理它以进行搜索。因此,我不能采用匹配的术语并将其从原始查询中删除(因为“ headphon”!=“ headphones”)。


希望这样可以使我在寻找什么更加清晰。

最佳答案

我不理解您的用例,但您听起来好像在询问BooleanQuery API。您可以通过调用getClauses来获取查询的子句。

一个简单的例子:

BooleanQuery bq = new BooleanQuery();
bq.add(new TermQuery(new Term("field1","a")), BooleanClause.Occur.SHOULD)
bq.add(new TermQuery(new Term("field1","b")), BooleanClause.Occur.SHOULD)

BooleanClause[] clauses = bq.getClauses();




编辑:也许您只是在寻找搜索算法。用伪代码:

generate_query (qs_that_matched, qs_that_didnt_match, level):
new_query = qs_that_matched AND level:qs_that_didnt_match
qs_still_unmatched = ...
qs_which_just_matched = ...
if qs_still_unmatched != null:
return generate_query(qs_that_matched AND qs_which_just_matched, qs_still_unmatched, level+1)
else:
return qs_that_matched AND qs_which_just_matched

关于java - 在Lucene中嵌套搜索而不重复关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8011677/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com