Подтвердить что ты не робот

Как выбрать различные значения полей с помощью 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?

4b9b3361

Ответ 1

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>

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

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

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

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

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

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

Используйте 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}}}}

Ответ 5

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

Ответ 6

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

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