如何使用Solr选择不同的字段值?

wydwbb8l  于 2022-12-26  发布在  Solr
关注(0)|答案(6)|浏览(205)

我想做这个SQL的等价物,但是使用Solr作为我的数据存储。

SELECT
   DISTINCT txt
FROM
   my_table;

什么语法会强制Solr只给予我不同的值?

http://localhost:8983/solr/select?q=txt:?????&fl=txt

**编辑:**所以分面搜索似乎很合适,但是当我研究它时,我意识到我只详细描述了问题的一半。

我的SQL查询应该读取...

SELECT
   DISTINCT SUBSTR(txt,0,3)
FROM
   my_table;

solr 有这种可能性吗

s71maibg

s71maibg1#

分面将为您获得一个包含字段的不同值的结果集。
例如

http://localhost:8983/solr/select/?q=*%3A*&rows=0&facet=on&facet.field=txt

你应该得到这样的回报:

<response>
<responseHeader><status>0</status><QTime>2</QTime></responseHeader>
<result numFound="4" start="0"/>
<lst name="facet_counts">
 <lst name="facet_queries"/>
 <lst name="facet_fields">
  <lst name="txt">
        <int name="value">100</int>
        <int name="value1">80</int>
        <int name="value2">5</int>
        <int name="value3">2</int>
        <int name="value4">1</int>
  </lst>
 </lst>
</lst>
</response>

查看wiki了解更多信息。面化是solr中非常酷的一部分。享受:)
http://wiki.apache.org/solr/SimpleFacetParameters#Facet_Fields
注意:分面将显示索引值,即在应用了所有过滤器之后。一种解决方法是使用copyfield方法,这样你就可以创建一个分面版本的txt字段。这样你的结果将显示原始值。
维基上有很多关于刻面的文档。或者我确实写了一些带有屏幕截图的文档。你可以在这里查看:
http://www.craftyfella.com/2010/01/faceting-and-multifaceting-syntax-in.html

os8fio9y

os8fio9y2#

对于问题中的DISTINCT部分,我想您可能会寻找Solr的field collapsing / grouping functions,它将使您能够指定一个字段,您希望从中获得唯一的结果,根据这些唯一值创建一个组,它将显示该组中有多少个文档。
然后可以使用存储在单独字段中的相同substr,并在该字段上折叠。

ne5o7dgx

ne5o7dgx3#

使用带有参数stats.calcdistinct的StatsComponent获取特定字段的不同值列表:
太阳能电池7 https://lucene.apache.org/solr/guide/7_7/the-stats-component.html
太阳能电池6 https://cwiki.apache.org/confluence/display/solr/The+Stats+Component
它还将提供不同值的计数。stats.calcdistinct可能从Python 4.7开始就可用了。
http://wiki.apache.org/solr/StatsComponent已过时,因为它不包含stats.calcdistinct

示例

/select?stats=on&stats.field=region&rows=0&stats.calcdistinct=true

"stats":{
  "stats_fields":{
    "region":{
      "min":"GB",
      "max":"GB",
      "count":20276,
      "missing":0,
      "distinctValues":["GB"],
      "countDistinct":1}}}}

与刻面的差异

在facet的情况下,你需要知道请求所有的计数,或者你设置facet.limit为一个非常高的值,然后自己计算结果。另外,你需要一个字符串字段来使facet按照你需要的方式工作。

watbbzwu

watbbzwu4#

我将子字符串存储在不同的字段中(让我们调用txt_substring),然后在txt_substring上创建facet,如CraftyFella所示。
通常我会使用n-gram tokenizer,但我不认为你可以在这方面。

ukqbszuj

ukqbszuj5#

Solr 5.1和更高版本提供了新的Facet Module,它集成了对查找字段中唯一值数量的支持,您甚至可以查找Facet的每个bucket的字段中唯一值的数量,并按该值排序以查找唯一值的最大或最小数量。
“myfield”中唯一值的数量:json.facet={x:“唯一(myfield)”}
按“类别”字段分面,并针对每个类别,以“颜色”显示唯一值的数量:

json.facet={
  cat_breakdown : { terms : {  // group results by unique values of "category"
    field : category,
    facet : {
      x : "unique(color)",  // for each category, find the number of unique colors
      y : "avg(price)"      // for each category, find the average price
    }
  }}
}

这在Solr 5.1和更高版本中。

of1yzvn4

of1yzvn46#

查找“myfield”中唯一值数量的最佳方法是使用JSON API

http://YourCollectionAddress/select?json
={query:'\*:\*',limit:0,facet:{distinctCount:'unique(myfield)'}}

相关问题