Как выбрать отдельные значения поля с помощью Solr? - PullRequest
51 голосов
/ 11 мая 2010

Я хотел бы сделать эквивалент этого 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?

Ответы [ 7 ]

71 голосов
/ 12 мая 2010

Faceting даст вам набор результатов, который содержит различные значения для поля.

например.

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>

Проверьте вики для получения дополнительной информации. Faceting - это действительно классная часть Solr. Наслаждайтесь:)

http://wiki.apache.org/solr/SimpleFacetParameters#Facet_Fields

Примечание: Faceting покажет индексированное значение, т.е. после того, как все фильтры были применены. Одним из способов обойти это является использование метода copyfield, так что вы можете создать фасетную версию поля txt. Таким образом, ваши результаты будут показывать исходное значение.

Надеюсь, что это поможет .. Много документации по огранке доступно в вики. Или я написал несколько снимков экрана ... которые вы можете посмотреть здесь:

http://www.craftyfella.com/2010/01/faceting-and-multifaceting-syntax-in.html

21 голосов
/ 07 декабря 2011

Что касается части DISTINCT вашего вопроса, я думаю, что вы, возможно, ищете функции свертывания / группировки полей Solr . Это позволит вам указать поле, из которого вы хотите получить уникальные результаты, создать группу с этими уникальными значениями и показать количество документов в этой группе.

Затем вы можете использовать те же substr, хранящиеся в отдельном поле, и свернуть на них.

4 голосов
/ 03 ноября 2014

Используйте StatsComponent с параметром 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

Это также даст вам счет различных значений. stats.calcdistinct вероятно доступен с 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.limit что-то действительно высокое и подсчитываете результат самостоятельно. Кроме того, вам нужно строковое поле, чтобы заставить фасеты работать так, как вам нужно здесь.

4 голосов
/ 12 мая 2010

Я бы сохранил подстроку в другом поле (давайте назовем txt_substring), а затем фасет на txt_substring, как показал CraftyFella.

Обычно я бы использовал n-граммовый токенизатор , но я не думаю, что вы можете с этим разобраться.

1 голос
/ 07 апреля 2015

Solr 5.1 и более поздние версии имеют новый модуль Facet, в который встроена поддержка поиска количества уникальных значений в поле. Вы даже можете найти количество уникальных значений в поле для каждого сегмента фасета и отсортировать по этому значению, чтобы найти наибольшее или наименьшее количество уникальных значений.

Количество уникальных значений в «myfield»: json.facet = {х: 'уникальный (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/

1 голос
/ 11 мая 2010

взгляните на граненый поиск

0 голосов
/ 29 марта 2019

Лучший способ узнать количество уникальных значений в «myfield», используя JSON API:

http://YourCollectionAddress/select?json
={query:'\*:\*',limit:0,facet:{distinctCount:'unique(myfield)'}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...