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