代码之家  ›  专栏  ›  技术社区  ›  dacracot

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

  •  51
  • dacracot  · 技术社区  · 14 年前

    我想用Solr作为我的数据存储,做与SQL相同的事情。

    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有这种可能性吗?

    6 回复  |  直到 14 年前
        1
  •  8
  •   Risadinha    5 年前

    将StatComponent与参数一起使用 stats.calcdistinct 要获取特定字段的不同值列表,请执行以下操作:

    Solr 7 https://lucene.apache.org/solr/guide/7_7/the-stats-component.html

    Solr 6 https://cwiki.apache.org/confluence/display/solr/The+Stats+Component

    它还将为您提供不同值的计数。 统计数据。CalcDistinc 可能从4.7开始提供。

    http://wiki.apache.org/solr/StatsComponent 已经过时了,因为它不包括 统计数据。CalcDistinc

    实例

    /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,您需要知道请求all的计数,或者设置facet。限制在非常高的范围内,自己计算结果。此外,还需要一个字符串字段,以使镶嵌面按此处所需的方式工作。

        2
  •  75
  •   CraftyFella    14 年前

    刻面将得到一个结果集,其中包含字段的不同值。

    例如。

    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

        3
  •  3
  •   Yonik    9 年前

    Solr 5.1及更高版本提供了新的方面模块,该模块集成了对查找字段中唯一值数量的支持。您甚至可以在一个字段中为一个方面的每个bucket找到唯一值的数量,并按该值排序以找到最高或最低数量的唯一值。

    “myfield”中唯一值的数量: json。facet={x:'unique(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及更高版本中。更多方面的功能,如“独特”显示在 http://yonik.com/solr-facet-functions/

        4
  •  24
  •   Antony Stubbs    13 年前

    对于 DISTINCT 你问题的一部分,我想你可能在找索尔的 field collapsing / grouping functions

    然后你可以用同样的方法 substr 储存在另一块地上,然后在上面倒塌。

        5
  •  4
  •   Mauricio Scheffer    14 年前

    我会将子字符串存储在另一个字段中(让我们调用 txt_substring ),然后继续 txt_子串 正如克拉夫蒂费拉所展示的那样。

    通常我会使用 n-gram tokenizer ,但我认为你不能就此置之不理。

        6
  •  0
  •   Abhinav Saxena    5 年前

    使用 JSON API :

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