Я хотел бы сделать эквивалент этого 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?
Я бы хранил подстроку в другом поле (назовем его txt_substring
), а затем сделал фасет по txt_substring
, как показал CraftyFella.
Обычно я бы использовал n-gram tokenizer, но я не думаю, что на нем можно делать фасет.
Фасеттинг даст вам набор результатов, содержащий различные значения для поля.
Например,
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
Примечание: Faceting покажет индексированное значение, т.е. после применения всех фильтров. Один из способов обойти это - использовать метод copyfield, чтобы создать фасетную версию поля txt. Таким образом, ваши результаты будут показывать оригинальное значение.
Надеюсь, это поможет. Много документации по фасетам доступно на вики. Или я написал несколько со снимками экрана, которые вы можете посмотреть здесь:
http://www.craftyfella.com/2010/01/faceting-and-multifaceting-syntax-in.html