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