Вопрос
Где я могу найти полный пример, показывающий, как работает иерархический фасетный поиск от индексации документов до получения результатов поиска?
Мои исследования на данный момент
В Stackoverflow есть несколько сообщений, но все они затрагивают только определенные аспекты иерархического фасетного поиска; поэтому я бы не стал считать их дубликатами. Я ищу полный пример, чтобы понять это. Мне не хватает последнего запроса, в котором работают агрегаты.
- Это было бы в значительной степени именно то, что я ищу, но, опять же, не полное пошаговое руководство: Solr Hierarchical Огранка. Необходим пример
На веб-странице Solr есть документация, но я не понял приведенный там пример.
Пример (концептуально)
Я хотел бы создать здесь полный пример пошагового руководства и надеюсь, что вы сможете предоставить недостающий последний фрагмент.
Testdata
Ввод
Допустим, у нас есть 3 документа, каждый из которых является человеком.
Alice (document 1)
- Blond
- Europe
Jane (document 2)
- Brown
- Europe/Norway
Bob (document 3)
- Brown
- Europe/Norway
- Europe/Sweden
Вывод
Ожидаемый результат для этого (в настоящее время неверного) запроса
http://server:8983/solr/my_core/select?q=*%3A*&wt=json&indent=true&facet=true&facet.field=tags_ss
должно быть
Hair_color (3)
- blond (1)
- brown (1)
- black (1)
Location (3)
- Europe (4) // This should be 4 not 3, i.e. the sum of the leaves, because Alice is tagged with "Europe" only, without a country
- Norway (2)
- Sweden (1)
потому что все документы найдены.
Пример (программно)
Вот где мне нужна помощь. Как мне реализовать приведенный выше концептуальный пример?
Вот как далеко я зашел.
1. Создайте тестовые данные XML
Это содержимое файла documents.xml
в подпапке solr-5.1.0/testdata
:
<add>
<doc>
<field name="id">Alice</field>
<field name="tags_ss">hair_color/blond</field>
<field name="tags_ss">location/Europe</field>
</doc>
<doc>
<field name="id">Jane</field>
<field name="tags_ss">hair_color/brown</field>
<field name="tags_ss">location/Europe/Norway</field>
</doc>
<doc>
<field name="id">Bob</field>
<field name="tags_ss">hair_color/black</field>
<field name="tags_ss">location/Europe/Norway</field>
<field name="tags_ss">location/Europe/Sweden</field>
</doc>
</add>
_ss
определяется в schema.xml
как
<dynamicField name="*_ss" type="string" indexed="true" stored="true" multiValued="true"/>
Обратите внимание, что все теги, например hair_color
и location
и другие теги, которые будут добавлены в будущем, хранятся в том же поле tags_ss
.
2. Индексируйте тестовые данные с помощью Solr
c:\solr-5.1.0>java -classpath dist/solr-core-5.1.0.jar -Dauto=yes -Dc=gettingstarted -Ddata=files -Drecursive=yes -Durl=http://server:8983/solr/my_core/update org.apache.solr.util.SimplePostTool .\testdata
3. Получить все данные с помощью запроса Solr (без фасетирования)
Запрос
http://server:8983/solr/my_core/select?q=*%3A*&wt=json&indent=true
Результат
{
"responseHeader": {
"status": 0,
"QTime": 0,
"params": {
"indent": "true",
"q": "*:*",
"_": "1430830360536",
"wt": "json"
}
},
"response": {
"numFound": 3,
"start": 0,
"docs": [
{
"id": "Alice",
"tags_ss": [
"hair_color/blond",
"location/europe"
],
"_version_": 1500334369469890600
},
{
"id": "Jane",
"tags_ss": [
"hair_color/brown",
"location/europe/Norway"
],
"_version_": 1500334369469890600
},
{
"id": "Bob",
"tags_ss": [
"hair_color/black",
"location/europe/Norway",
"location/europe/Sweden"
],
"_version_": 1500334369469890600
}
]
}
}
4. Получить все данные с помощью запроса Solr (с фасетированием)
Запрос
http://server:8983/solr/my_core/select?q=*%3A*&wt=json&indent=true&facet=true&facet.field=tags_ss
Результат
{
"responseHeader": {
"status": 0,
"QTime": 0,
"params": {
"facet": "true",
"indent": "true",
"q": "*:*",
"_": "1430830432389",
"facet.field": "tags_ss",
"wt": "json"
}
},
"response": {
"numFound": 3,
"start": 0,
"docs": [
{
"id": "Alice",
"tags_ss": [
"hair_color/blond",
"location/europe"
],
"_version_": 1500334369469890600
},
{
"id": "Jane",
"tags_ss": [
"hair_color/brown",
"location/europe/Norway"
],
"_version_": 1500334369469890600
},
{
"id": "Bob",
"tags_ss": [
"hair_color/black",
"location/europe/Norway",
"location/europe/Sweden"
],
"_version_": 1500334369469890600
}
]
},
"facet_counts": {
"facet_queries": {},
"facet_fields": {
"tags_ss": [
"location/europe/Norway",
2,
"hair_color/black",
1,
"hair_color/blond",
1,
"hair_color/brown",
1,
"location/europe",
1,
"location/europe/Sweden",
1
]
},
"facet_dates": {},
"facet_ranges": {},
"facet_intervals": {},
"facet_heatmaps": {}
}
}
Обратите внимание на этот раздел внизу результата:
"facet_fields": {
"tags_ss": [
"location/europe/Norway",
2,
"hair_color/black",
1,
"hair_color/blond",
1,
"hair_color/brown",
1,
"location/europe",
1,
"location/europe/Sweden",
1
]
},
Он показывает все теги в виде плоского списка (не иерархического).
5. Получить все данные с помощью запроса Solr (с иерархическим фасетом)
Запрос
Вот моя проблема. Я не знаю, как составить запрос, который возвращает следующий результат (результат уже показан в концептуальном примере выше).
Результат (вымышленный, создан вручную для иллюстрации)
{
"responseHeader":{
"status":0,
"QTime":0,
"params":{
"facet":"true",
"indent":"true",
"q":"*:*",
"facet.field":"tags_ss",
"wt":"json",
"rows":"0"}},
"response":{"numFound":3,"start":0,"docs":[]
},
"facet_counts":{
"facet_queries":{},
"facet_fields":{
"tags_ss":[
"hair_color,3, // This aggregations is missing
"hair_color/black",1,
"hair_color/blond",1,
"hair_color/brown",1,
"location/europe",4, // This aggregation should be 4 but is 1
"location/europe/Norway",2,
"location/europe/Sweden",1]},
"facet_dates":{},
"facet_ranges":{},
"facet_intervals":{},
"facet_heatmaps":{}}}
Этот список тегов все еще плоский, но по крайней мере location/europe = 4
можно было бы правильно агрегировать, но в настоящее время это не так. Я продолжаю получать location/europe = 1
, потому что он установлен только для Alice
, а Bob
Norway
и Sweden
не суммируются, чтобы также засчитывать Europe
.
Идеи
- Мне может понадобиться использовать
facet.pivot
, но я не знаю как. - Мне может понадобиться использовать
facet.prefix
, но я не знаю как.
Версии
- Solr 5.1.0
- Windows 7