【问题标题】:Solr 7 - How to do Full Text Search w/ Geo Spatial SearchSolr 7 - 如何使用/地理空间搜索进行全文搜索
【发布时间】:2018-06-29 02:53:19
【问题描述】:

如何在 Solr 7 中将全文与地理空间相结合?

对此:https://lucene.apache.org/solr/guide/7_2/spatial-search.html

我必须进行 COMBINE 全文与地理空间的查询。例如:

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

所以在这种情况下,会按距离排序,但也会按某些全文“某些文本”值进行过滤。

如果无法做到这一点,我相信在 Elastic Search 中是可能的,但是这些(Solr 和 Elastic Search)都是建立在 Lucene 之上的,所以看起来它应该在两者上都可以工作,但可以随意提供也可以回答 Elastic Search。

示例返回

{
  "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,转而使用 Elastic Search。与非常易于使用的 Elastic Search 相比,Solr 的奇怪方式非常令人讨厌。事情就像您期望的那样工作,而无需深入研究怪癖。

【问题讨论】:

    标签: solr lucene


    【解决方案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

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

    结果如预期:

    1. 苹果 60 GB iPod
    2. 贝尔金 iPod 电源线
    3. 按距离过滤:iPod 和 iPod Mini USB 2.0 数据线

    提示

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

    【讨论】:

    • 在单个查询中应该是可能的。我已将整个查询放在我的答案中。请让我知道,如果它不起作用。可能存在语法错误。我已经使用其他数据检查了本地系统上的查询。
    • 我将我的答案改编为 solr 7.2.1 示例数据,以便您重现它。我还简化了查询。你只需要 bbox 或 geofilt。
    • 仍然有 0 个结果:您必须确保您的全文查询查询正确的字段。我更喜欢 edismax 解析器。在这里,您可以通过 qf 参数指定字段。例如qf=name,text 混淆?
    • 原来主要的问题是没有默认的搜索方式而不在 q 参数中指定键,即 q=field:abc 但不是 q=abc,谢谢!
    【解决方案2】:

    在您的情况下,您必须将全文搜索评分与空间距离​​相结合。

    如果您的查询如下所示:

    /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())

    试试吧,它应该可以工作,但当然需要一些调整。

    【讨论】:

    • 在后台,我不需要去 ElasticSearch,但我最终还是这样做了。它们本质上是 Lucene 的包装器,但 Elastic 有时似乎更容易一些。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-19
    • 1970-01-01
    相关资源
    最近更新 更多