Solr 7 - 如何使用地理空间搜索进行全文搜索

时间:2018-01-19 19:34:45

标签: solr lucene

如何在Solr 7中使用Geo Spatial组合全文?

关于这一点:https://lucene.apache.org/solr/guide/7_2/spatial-search.html

我必须执行 COMBINE 全文w / geo spatial的查询。例如:

box AND full textspatial sort AND full text

我无法找出产生此预期结果的良好查询字符串示例。我希望这是一个纯粹的查询字符串,而不是一些Java方法,因为我在Java以外的其他技术上使用它。 Solr是非常深刻和令人困惑的,我知道我必须阅读更多,但我找到的网上任何地方都没有很好的例子。

所需的查询字符串示例

[solr]/select?fq={!bbox sfield=point}&pt=34.04506799999999,-118.260849&d=10000&sort=geodist() asc&{!geofilt}&sfield=point&q=Panini

因此,在这种情况下,将按距离排序,并按一些全文过滤"某些文字"值。

如果无法做到这一点,我相信它可能在弹性搜索中,但这些(Solr和弹性搜索)都建立在Lucene之上,所以看起来它应该适用于两者如果在一个上工作但随意提供回答弹性搜索。

示例返回

{
  "responseHeader": {
    "status": 0,
    "QTime": 2,
    "params": {
        "q": "Panini",
        "pt": "34.04506799999999,-118.260849",
        "d": "10000",
        "{!geofilt}": "",
        "fq": "{!bbox sfield=point}",
        "sort": "geodist() asc",
        "sfield": "point"
    }
  },
  "response": {
    "numFound": 0,
    "start": 0,
    "docs": []
  }
}

文档确实包含这个词组' Panini'但没有人回来。可能是由于默认方式是在Solr 7中处理全文?它使用了“Panini”这个术语的相同点。使用,字段点的类型为org.apache.solr.schema.PointType。

更新

我最终放弃了Solr for Elastic Search。与非常容易使用的弹性搜索相比,Solr以其奇怪的方式非常烦人。事情就像你期望的那样工作,而不必深究怪癖。

2 个答案:

答案 0 :(得分:1)

我根据solr 7.2.1示例调整了我的答案:

启动solr:./bin/solr start -e techproducts

我还想象了谷歌地图中的数据: https://www.google.com/maps/d/u/0/viewer?ll=42.00542239270033%2C-89.81213734375001&hl=en&hl=en&z=4&mid=16gaLvuWdE9TsnhcbK-BMu5DVYMzR9Vir

您需要这些query parameters

以盒式过滤器绑定:

  • FQ = {!BBOX}

地理过滤器查询解析器bbox需要更多参数:

  • Solr字段:sfield = store
  • 指向搜索/排序:pt = 36.35,-97.51
  • 过滤器的距离:d = 1200

<强>类别:

  • sort = geodist()asc

全文查询:

  • Q =一些+文本

solr示例数据的完整示例查询:

<强>简单: http://localhost:8983/solr/techproducts/select?fq={!bbox}&sort=geodist()%20asc&sfield=store&pt=36.35,-97.51&d=1200&q=ipod&fl=name,store

<强> UI: http://localhost:8983/solr/techproducts/browse?fq={!bbox}&sort=geodist()%20asc&sfield=store&pt=36.35,-97.51&d=1200&q=ipod

结果如预期:

  1. Apple 60 GB iPod
  2. 适用于iPod的Belkin电源线
  3. 按距离过滤:iPod&amp; iPod Mini USB 2.0电缆
  4. <强>提示

    • 字段存储必须是类型位置:  
    • 您可以Urlencode特殊字符: 例如FQ =%7B%21bbox%20sfield%3DgeoLocation%7D

答案 1 :(得分:1)

在这种情况下,您必须将全文搜索得分与空间距离​​结合起来。

因此,如果您的查询如下所示:

/select?fq={!bbox sfield=point}&pt=34.04506799999999,-118.260849&d=10000&sort=geodist() asc&{!geofilt}&sfield=point&q=Panini

您应该更改sort参数并将其删除或将其设置为score desc。这样,您就可以根据全文搜索查询给出的分数进行排序。

要考虑空间部分,您需要在查询中包含增强功能。在大多数情况下-文档离兴趣点越近越好,因此您可能希望包括执行X/distance的增强功能。 X可以像1一样简单,函数本身也可以更复杂。为此,您可以在dismax查询中使用bf参数,例如bf=div(1,geodist())

尝试一下,它应该可以工作,但是当然需要进行一些调整。