【问题标题】:Solr Query Exact Match and partial match search QueryingSolr 查询精确匹配和部分匹配搜索查询
【发布时间】:2017-03-02 23:02:49
【问题描述】:

我必须搜索一些具有完全匹配和部分匹配的文档。 例如:我有标题为“ABC-01 CAB 现在很忙。ABCDE CAB 可用”的文档。我想以高分搜索 ABC-01(与标题中的搜索词完全匹配)另外我想搜索包含 ABC-01 的文档。它也应该按照分数和日期按降序排序。 还有一个名为 driver 的字段。 search 还应该搜索得分低于标题完全匹配或部分匹配的驱动程序字段。

(请注意完全匹配搜索仅“ABC-01”而非“ABC-010”) 这有什么线索吗?

  • id:ABC-01
  • 标题:ABC-01 驾驶室现在很忙。 ABCDE CAB 可用
  • 加入日期:2016-01-10

  • id:ABC-010
  • 标题:ABC-001010 可用
  • 加入日期:2016-01-12
  • 司机:ABCMAN


  • id:XYZ-05

  • 标题:XYZ-05 CAB 可用,ABC-01-XE 可用
  • 加入日期:2015-01-12 司机:ABCD MAN ABC-01

  • id:ABC-07
  • 标题:ABC-07 可用 ABC-01-XE
  • 加入日期:2015-01-12
  • 驱动:CD MAN ABC-05

对于这个例子 如果我搜索 ABC-01

- 我想要以下结果

  • id:ABC-01
  • 标题:ABC-01 可用
  • 加入日期:2016-08-12
  • 司机:ABCMAN

  • id:XYZ-05
  • 标题:XYZ-05 CAB 可用,ABC-07 可用
  • 加入日期:2015-01-12
  • 司机:ABCD MAN ABC-01

  • id:ABC-07
  • 标题:ABC-07 可用 ABC-01-XE
  • 加入日期:2015-01-11
  • 驱动:CD MAN ABC-05

如果搜索词与标题完全匹配,则应获得高分。 或者如果不是,它应该搜索包含 ABC-01 或 abc-01-xe 或任何包含 abc-01 的标题字段。 它还应该搜索驱动程序字段以查找给定术语的任何相关驱动程序。

结果应根据分数和日期进行排序。 此外,精确匹配的最近日期应首先与订单一起显示。

【问题讨论】:

    标签: apache search solr solr4


    【解决方案1】:

    编辑回复: 正如亚历山大指出的那样,您使用 edismax 分配权重。为了好玩,如果您将底部的示例数据添加到测试核心并运行以下搜索,它会为您提供正确的 cab 顺序。

    http://.us-west-2.compute.amazonaws.com:8983/solr/abc123/select?defType=edismax&indent=on&q=id:ABC-01*%20ORTitle:ABC-01&qf=id^1.5%20Title^0.7&wt=json

    在常规查询中,您可以使用 OR:进行普通的普通通配符搜索:

    id:ABC-01* 
    OR
    Title:*ABC-01*
    

    然后启用 edismax 并分配权重,我将 id 提高 1.5 并将 Title 减少到 0.7,如下所示:

    id^1.5 Title^0.7
    

    回复如下:

    {
      "responseHeader":{
        "status":0,
        "QTime":23,
        "params":{
          "q":"id:ABC-01* \nOR\nTitle:*ABC-01*",
          "defType":"edismax",
          "indent":"on",
          "qf":"id^1.5 Title^0.7",
          "wt":"json",
          "_":"1477029831405"}},
      "response":{"numFound":13,"start":0,"docs":[
          {
            "id":"ABC-01",
            "Title":["ABC-01 CAB IS BUSY RIGHT NOW. ABCDE CAB IS AVAILABLE"],
            "joinedDate":["2016-01-10T00:00:00Z"],
            "_version_":1548778151323107328},
          {
            "id":"ABC-010",
            "Title":["ABC-01 CAB IS BUSY RIGHT NOW. ABCDE CAB IS AVAILABLE"],
            "joinedDate":["2016-01-14T00:00:00Z"],
            "_version_":1548778151552745472},
          {
            "id":"ABC-01234",
            "Title":["ABC-01 CAB IS BUSY RIGHT NOW. ABCDE CAB IS AVAILABLE"],
            "joinedDate":["2016-01-14T00:00:00Z"],
            "_version_":1548778803999801344},
          {
            "id":"ABC-02",
            "Title":["ABC-01 CAB IS BUSY RIGHT NOW. ABCDE CAB IS AVAILABLE"],
            "joinedDate":["2016-01-11T00:00:00Z"],
            "_version_":1548778151538065408},
          {
            "id":"ABC-03",
            "Title":["ABC-01 CAB IS BUSY RIGHT NOW. ABCDE CAB IS AVAILABLE"],
            "joinedDate":["2016-01-12T00:00:00Z"],
            "_version_":1548778151548551168},
          {
            "id":"ABC-04",
            "Title":["ABC-01 CAB IS BUSY RIGHT NOW. ABCDE CAB IS AVAILABLE"],
            "joinedDate":["2016-01-13T00:00:00Z"],
            "_version_":1548778151549599744},
          {
            "id":"XYZ-04",
            "Title":["ABC-01 CAB IS BUSY RIGHT NOW. ABCDE CAB IS AVAILABLE"],
            "joinedDate":["2016-01-13T00:00:00Z"],
            "_version_":1548778151556939776},
          {
            "id":"ABC-07",
            "Title":["ABC-07 IS AVAILABLE ABC-01-XE"],
            "joinedDate":["2015-01-12T00:00:00Z"],
            "_version_":1548778495705874432},
          {
            "id":"BBC-02",
            "Title":["ABC-01 CAB IS BUSY RIGHT NOW. "],
            "joinedDate":["2016-01-11T00:00:00Z"],
            "_version_":1548778803994558464},
          {
            "id":"ABC-010101",
            "Title":["ABC-02 CAB IS BUSY RIGHT NOW. ABC01 CAB IS AVAILABLE"],
            "joinedDate":["2016-01-12T00:00:00Z"],
            "_version_":1548778803995607040}]
      }}
    

    要添加的样本数据:

     <add><doc>
    <field name="id">ABC-01</field>
    <field name="Title">ABC-01 CAB IS BUSY RIGHT NOW. ABCDE CAB IS AVAILABLE</field>
    <field name="joinedDate">2016-01-10</field>
    </doc>
    <doc>
    <field name="id">ABC-02</field>
    <field name="Title">ABC-01 CAB IS BUSY RIGHT NOW. ABCDE CAB IS AVAILABLE</field>
    <field name="joinedDate">2016-01-11</field>
    </doc>
    <doc>
    <field name="id">ABC-03</field>
    <field name="Title">ABC-01 CAB IS BUSY RIGHT NOW. ABCDE CAB IS AVAILABLE</field>
    <field name="joinedDate">2016-01-12</field>
    </doc>
    <doc>
    <field name="id">ABC-04</field>
    <field name="Title">ABC-01 CAB IS BUSY RIGHT NOW. ABCDE CAB IS AVAILABLE</field>
    <field name="joinedDate">2016-01-13</field>
    </doc>
    <doc>
    <field name="id">ABC-010</field>
    <field name="Title">ABC-01 CAB IS BUSY RIGHT NOW. ABCDE CAB IS AVAILABLE</field>
    <field name="joinedDate">2016-01-14</field>
    </doc>
    <doc>
    <field name="id">ABC-07</field>
    <field name="Title">ABC-07 IS AVAILABLE ABC-01-XE</field>
    <field name="joinedDate">2015-01-12</field>
    </doc>
    
    <doc>
    <field name="id">XYZ-04</field>
    <field name="Title">ABC-01 CAB IS BUSY RIGHT NOW. ABCDE CAB IS AVAILABLE</field>
    <field name="joinedDate">2016-01-13</field>
    </doc>
    <doc>
    <field name="id">DBC-01</field>
    <field name="Title">DBC-01 CAB IS BUSY RIGHT NOW. ABCDE CAB IS AVAILABLE</field>
    <field name="joinedDate">2016-01-10</field>
    </doc>
    <doc>
    <field name="id">BBC-02</field>
    <field name="Title">ABC-01 CAB IS BUSY RIGHT NOW. </field>
    <field name="joinedDate">2016-01-11</field>
    </doc>
    <doc>
    <field name="id">ABC-010101</field>
    <field name="Title">ABC-02 CAB IS BUSY RIGHT NOW. ABC01 CAB IS AVAILABLE</field>
    <field name="joinedDate">2016-01-12</field>
    </doc>
    <doc>
    <field name="id">ABC-01QWERTY</field>
    <field name="Title">CAB IS BUSY RIGHT NOW. </field>
    <field name="joinedDate">2016-01-13</field>
    </doc>
    <doc>
    <field name="id">ABC-01234</field>
    <field name="Title">ABC-01 CAB IS BUSY RIGHT NOW. ABCDE CAB IS AVAILABLE</field>
    <field name="joinedDate">2016-01-14</field>
    </doc>
    <doc>
    <field name="id">ABC-007</field>
    <field name="Title">ABC-007 IS AVAILABLE ABC-01-XE</field>
    <field name="joinedDate">2015-01-12</field>
    </doc>
    <doc>
    <field name="id">XYZ-014</field>
    <field name="Title"> ABCDE CAB IS AVAILABLE. ABC-01 CAB IS BUSY RIGHT NOW.</field>
    <field name="joinedDate">2016-01-13</field>
    </doc></add>
    

    原始回复: 您可能正在寻找类似的东西:

    id:ABC-01* OR id:*ABC
    

    URL 中的查询如下所示:

    http:<server>:8983/solr/<core>/select?indent=on&q=id:ABC-01*%20OR%20id:*ABC&wt=json 
    

    【讨论】:

    • Raza,这就是您要找的东西吗?你能再举几个输入和预期输出的例子,这样我们就可以再磨练一点吗?谢谢。
    • 感谢您的评论 Lefty G Balogh 。请看我编辑的问题。
    • 非常感谢您的解释,,
    【解决方案2】:

    您在这里有几个问题。

    您可以使用 eDisMax 搜索多个字段,并为不同的字段赋予不同的权重以进行排序。

    您可以按混合分数和日期的函数查询进行排序并进行实验,直到获得正确的组合。

    将 ABC-01-xe 与 ABC-01 匹配有点困难,因为不清楚您的意思。这将是某种索引时间分析器链元素,但哪一个取决于您的映射的具体情况。 ABC-01-ANYTHING 是映射到 ABC-01,还是必须是 ABC-01-xe。 ABC-01234 呢?您需要首先获取此映射的业务规则,然后确保 - 在索引时间分析器链的末端 - 您得到了您想要的。您可能还希望两个具有相同信息的字段以不同方式处理,而一个处理较少的字段(例如 ABC-01 精确)具有较高的权重。

    【讨论】:

    • ABC-01-WHATEVER 应该匹配 ABC-01.,,,
    • ABC-01234 怎么样?这很重要,因为问题是边界。你是在'0'上打破还是在前缀上匹配?
    • 我以“ABC-01”作为搜索词。我应该在上述字段中搜索包含 ABC-01 的任何内容。 :) 示例:如果 Input 是 abc-01 它应该返回结果 ABC-01, blah blah blah ABC-01 , ABC-01 Blah Blah,Foo Bar ABC-01XXX,ABC-01-0111 FOO BAR 。 ")
    • 那么您可能正在寻找 [Edge N-grams|cwiki.apache.org/confluence/display/solr/…,但问题是您的前缀是否总是 5 个字符长。如果不是。例如。如果 Taxi id 可能是 XYZ-5678 并且您需要对其进行规范化,那么您将重新尝试找出识别前缀是什么的业务规则。
    猜你喜欢
    • 2020-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-08
    • 1970-01-01
    相关资源
    最近更新 更多