【问题标题】:Apache Solr: sort by one of fields (with condition)Apache Solr:按字段之一排序(有条件)
【发布时间】:2017-03-11 11:14:07
【问题描述】:

如果文档中存在,我想按“field1”添加排序,如果不存在,则按“field2”添加。 请帮助我查询语法。

【问题讨论】:

  • 您的意思是您的集合中有两种不同类型的文档 - 一种具有 field1,另一种具有 field2?或者你的意思是所有文档都有 field1 和 field2 但有时 field1 里面没有数据?
  • 我现在没有管理 UI,但我会尝试查看这两个字段的查询可能就是您所需要的...我会在首先是管理 UI - 使用 edismax - 在其中您可以使用 qf 字段,您可以在其中输入 field1,field2 我相信...
  • 类似这样的东西:qf="field1^2 field2" "^" 将 field1 提升一点 (2),并且只有在 field1 中有内容时才应使用该提升。
  • 我的意思是 2 种不同类型的文档 - 第一个有 field1,第二个有 field2
  • 这是一个复杂的查询,有很多条件,我需要像上面描述的那样添加排序参数。我在想我需要类似 sort=if(exist(field1), ..., ...)....

标签: solr


【解决方案1】:

正如SO question中已经指出的那样

尝试对 int 字段使用类似的东西:

sort=min(def(A_160018,9000000),def(A_chandigarh1,9000000))

对于字符串字段,选项将是在核心/集合中使用包含字段串联的额外字段 - 例如fullname: lastname + ' ' + firstname 在创建时明确写在文档中。 那你还是可以sort=fullname asc

【讨论】:

  • 字符串字段需要它,而新的组合字段不适合这个任务(因为排序字段可以动态更改,在这种情况下我必须为所有文档重建这些组合字段每次更改)
  • 目前在 lucene 中构建的排序方式,除了双精度外,不允许使用任何其他东西进行搜索。这就是为什么排序函数if(exists(firstname), firstname, lastname) asc 不能工作并且solr 在FunctionValues#doubleVal(int) 方法返回UnsupportedOperationException 的原因。正如提示 name asc 被处理为 ord(name) asc (它返回一个双精度值)
  • 感谢帮助,我用字符串类型比较器创建了自己的函数(基于默认的 DefFunction)
  • 您能否添加一些示例查询,看看您是如何解决问题的?
  • ...sort=getField(field1,field2) asc。对于 getField 我使用了 DefFunction 的来源,更改了:` private FunctionValues get(int doc) { for (int i = 0; i class ValueSourceComparator extends SimpleFieldComparator<String> .....
猜你喜欢
  • 2018-03-08
  • 2022-01-26
  • 1970-01-01
  • 1970-01-01
  • 2015-01-20
  • 1970-01-01
  • 1970-01-01
  • 2012-05-18
  • 1970-01-01
相关资源
最近更新 更多