Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Solr 7-如何使用地理空间搜索进行全文搜索 如何在Solr 7中与地理空间进行全文合并?_Solr_Lucene - Fatal编程技术网

Solr 7-如何使用地理空间搜索进行全文搜索 如何在Solr 7中与地理空间进行全文合并?

Solr 7-如何使用地理空间搜索进行全文搜索 如何在Solr 7中与地理空间进行全文合并?,solr,lucene,Solr,Lucene,关于这一点: 我必须进行结合全文和地理空间的查询。例如: 框和全文或空间排序和全文 我无法找到一个好的查询字符串示例来生成所需的结果。我希望这是一个纯查询字符串,而不是一些Java方法,因为我使用的是Java以外的其他技术。Solr是非常深刻和混乱的,我知道我必须多读一些,但我在网上找不到这方面的好例子 所需查询字符串示例 [solr]/select?fq={!bbox sfield=point}&pt=34.04506799999999,-118.260849&d=10000&

关于这一点:

我必须进行结合全文和地理空间的查询。例如:

框和全文
空间排序和全文

我无法找到一个好的查询字符串示例来生成所需的结果。我希望这是一个纯查询字符串,而不是一些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和Elastic Search)都是在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进行弹性搜索。与非常易于使用的弹性搜索相比,Solr在其奇怪的方式上非常恼人。事情正如你所期望的那样运行,而不必深入研究怪癖。

我将我的答案改编为solr 7.2.1示例:

启动solr by:
/bin/solr Start-e techproducts

我还将谷歌地图中的数据可视化:

您需要这些:

由框过滤器绑定:

  • fq={!bbox}
地理过滤器查询解析器bbox需要更多参数:

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

  • sort=geodist()asc
全文查询:

  • q=一些+文本
solr示例数据的完整示例查询:

简单:

UI:

结果如预期:

  • 苹果60 GB iPod
  • 用于iPod的Belkin电源线
  • 按距离过滤:iPod和iPod Mini USB 2.0电缆
  • 提示

    • 字段存储的类型必须为位置:
    • 您可以选择以下特殊字符: e、 g.fq=%7B%21bbox%20s字段%3地理位置%7D

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

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

    /select?fq={!bbox sfield=point}&pt=34.04506799999999,-118.260849&d=10000&sort=geodist() asc&{!geofilt}&sfield=point&q=Panini
    
    您应该更改
    sort
    参数,然后将其删除或仅将其设置为
    score desc
    。这样,您可以根据全文搜索查询中给出的分数进行排序

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


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

    它应该可以在单个查询中实现。我已经把整个问题都写进了我的答案里。如果不行,请告诉我。可能是语法错误。我已经用一些其他数据检查了本地系统上的查询。我将我的答案改编为solr 7.2.1示例数据,以便您可以重现它。我还简化了查询。您只需要bbox或geofilt。仍然有0个结果:您必须确保您的全文查询查询在正确的字段上。我更喜欢edismax解析器。在这里,您可以通过qf参数指定字段。e、 g.qf=名称,文本混乱?主要问题是没有默认的搜索方式,而不在q参数中指定键,即q=字段:abc但不是q=abc谢谢!在hindsite中,我不需要去ElasticSearch,但我最终还是这样做了。它们本质上是Lucene的包装,但有时弹性似乎更容易一些。