Java 在Lucene中嵌套搜索而不复制关键字
我想使用以下逻辑在Lucene中设置搜索(实际上是Lucene.NET,但我可以根据需要从Java转换):Java 在Lucene中嵌套搜索而不复制关键字,java,lucene,lucene.net,Java,Lucene,Lucene.net,我想使用以下逻辑在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)
)(+(field1:a)+(field2:B field2:C))
)(+(field1:afield1:bfield1:C)+(field3:afield3:bfield3:C))
,当我希望它是(+(field1:afield1:C)+(field3:B))
。我不能只查看第一次搜索的结果,然后从搜索字符串中删除单词,因为分析器在解析搜索时会将单词弄乱,而我无法将它们解乱,以找出它对应的原始搜索词
有什么建议吗
编辑: 好的,一般来说,我更喜欢抽象地描述我的问题,但我认为在这个过程中有一部分会丢失,所以我会更具体一些 我正在为一个需要几层搜索逻辑的站点构建一个搜索引擎。我将介绍的几个示例搜索是:
- “datattype”:一个字符串,表示此文档所代表的项目类型(产品、类别、品牌),因此我们知道如何显示它
- “品牌”:相关的品牌(类别有多个品牌,产品和品牌各有一个)
- “路径”:指向给定类别的路径(即“音频>耳机>入耳”的“入耳式音频耳机”)
- “关键字”:描述产品的各种东西,它们不会去其他地方
- 搜索类别
- 寻找品牌
- 搜索关键字
- 搜索类别:
+路径:耳机+数据类型:类别
- 有匹配项(耳机类别),并且原始查询中没有留下任何单词,因此我们返回它
- 搜索类别:`+(路径:怪物路径:耳机)+数据类型:类别
- 找到了路径:耳机和数据类型:类别的匹配项,使得“怪物”不匹配
- 搜索品牌:
+路径:耳机+品牌:怪物
- 找到了路径:耳机和品牌:怪物的匹配项,并且原始查询中没有留下任何单词,因此我们按怪物返回所有耳机
- 搜索类别:
+(路径:怪物路径:耳机路径:白色)+数据类型:类别
- 找到了路径:耳机和数据类型:类别的匹配项,使得“白色”和“怪物”不匹配
- 搜索品牌:
+路径:耳机+(品牌:怪物+品牌:白色)
- 找到了路径:耳机和品牌:怪物的匹配项,留下了不匹配的“白色”
- 搜索关键词:
+路径:耳机+品牌:怪物+关键词:白色
- 存在匹配项,并且原始查询中没有留下任何单词,因此我们返回它们
- 搜索类别:
+(路径:foobar路径:耳机路径:白色)+数据类型:类别
- 在
和路径:耳机
中找到了匹配项,使“白色”和“Foobar”不匹配数据类型:类别
- 搜索品牌:
+路径:耳机+(品牌:foobar+品牌:白色)
- 什么也没找到,所以我们继续
- 搜索关键词:
+路径:耳机+(关键词:白色关键词:foobar)
- 找到了路径:耳机和关键字:白色的匹配项,使“Foobar”不匹配
- 。。。(继续搜索其他字段,包括产品说明)
- 仍有不匹配的搜索词(“Foobar”),返回“未找到结果”
+路径:Headspes+(品牌:Headspes brand:monster)
)+path:headphon+datatype:Taxonomy
,因为我在搜索时弄乱了它。所以我不能接受匹配项和
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