Java 在Lucene中嵌套搜索而不复制关键字

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中不匹配的每个术语,搜索第三个字段 继续,直到字段用完,否则会出现使用了每个术语的搜索

我想使用以下逻辑在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:afield1:bfield1:C)+(field3:afield3:bfield3:C))
    ,当我希望它是
    (+(field1:afield1:C)+(field3:B))
    。我不能只查看第一次搜索的结果,然后从搜索字符串中删除单词,因为分析器在解析搜索时会将单词弄乱,而我无法将它们解乱,以找出它对应的原始搜索词

    有什么建议吗


    编辑: 好的,一般来说,我更喜欢抽象地描述我的问题,但我认为在这个过程中有一部分会丢失,所以我会更具体一些

    我正在为一个需要几层搜索逻辑的站点构建一个搜索引擎。我将介绍的几个示例搜索是:

  • 耳机
  • 怪物耳机
  • 白色怪物耳机
  • 白色Foobar耳机
  • 索引包含具有七个字段的文档-与此示例相关的字段包括:

    • “datattype”:一个字符串,表示此文档所代表的项目类型(产品、类别、品牌),因此我们知道如何显示它
    • “品牌”:相关的品牌(类别有多个品牌,产品和品牌各有一个)
    • “路径”:指向给定类别的路径(即“音频>耳机>入耳”的“入耳式音频耳机”)
    • “关键字”:描述产品的各种东西,它们不会去其他地方
    通常,搜索的每个步骤的逻辑如下所示:

  • 看看我们有没有匹配的
  • 如果是这样,请根据该匹配筛选结果,并在下一步中继续解析其余搜索词
  • 如果没有,请在下一步中解析搜索词
  • 每个步骤都类似于:

    • 搜索类别
    • 寻找品牌
    • 搜索关键字
    下面是这三个示例搜索的结果:

  • 耳机
    • 搜索类别:
      +路径:耳机+数据类型:类别
    • 有匹配项(耳机类别),并且原始查询中没有留下任何单词,因此我们返回它
  • 怪物耳机
    • 搜索类别:`+(路径:怪物路径:耳机)+数据类型:类别
    • 找到了路径:耳机和数据类型:类别的匹配项,使得“怪物”不匹配
    • 搜索品牌:
      +路径:耳机+品牌:怪物
    • 找到了路径:耳机和品牌:怪物的匹配项,并且原始查询中没有留下任何单词,因此我们按怪物返回所有耳机
  • 白色怪物耳机
    • 搜索类别:
      +(路径:怪物路径:耳机路径:白色)+数据类型:类别
    • 找到了路径:耳机和数据类型:类别的匹配项,使得“白色”和“怪物”不匹配
    • 搜索品牌:
      +路径:耳机+(品牌:怪物+品牌:白色)
    • 找到了路径:耳机和品牌:怪物的匹配项,留下了不匹配的“白色”
    • 搜索关键词:
      +路径:耳机+品牌:怪物+关键词:白色
    • 存在匹配项,并且原始查询中没有留下任何单词,因此我们返回它们
  • 白色Foobar耳机
    • 搜索类别:
      +(路径:foobar路径:耳机路径:白色)+数据类型:类别
    • 路径:耳机
      数据类型:类别
      中找到了匹配项,使“白色”和“Foobar”不匹配
    • 搜索品牌:
      +路径:耳机+(品牌:foobar+品牌:白色)
    • 什么也没找到,所以我们继续
    • 搜索关键词:
      +路径:耳机+(关键词:白色关键词:foobar)
    • 找到了路径:耳机和关键字:白色的匹配项,使“Foobar”不匹配
    • 。。。(继续搜索其他字段,包括产品说明)
    • 仍有不匹配的搜索词(“Foobar”),返回“未找到结果”
  • 我的问题有两个:

  • 我不想在所有东西都匹配后继续匹配(只有产品有描述,所以一旦达到这一步,我们就永远不会返回非产品的东西)。我可以通过使用denis的GetHitTerms from来管理这一点,但我随后会在所有后续字段中搜索第一个匹配的术语,直到所有内容都匹配为止(例如#2,我会有
    +路径: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