Как выбрать различные значения поля с помощью Solr?

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

6 ответов

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

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

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

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

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

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

Используйте StatsComponent с параметром stats.calcdistinct чтобы получить список различных значений для определенного поля:

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

Это также даст вам количество различных значений. (В случае с фасетами вам нужно знать количество, чтобы запросить все, или вы устанавливаете значение facet.limit на очень высокое значение и сами рассчитываете результат. Кроме того, вам нужно строковое поле, чтобы фасеты работали так, как вам нужно здесь.)

http://wiki.apache.org/solr/StatsComponent устарел, поскольку не покрывает stats.calcdistinct

stats.calcdistinct вероятно доступен с 4.7.

Пример:

/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}}}}

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

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

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

Количество уникальных значений в "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/

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

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

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

Другие вопросы по тегам