У меня есть экземпляр solr с DataImportHandler, указывающим на мою базу данных, в которой есть несколько таблиц, которые сопоставляются с json как ...
[
{
"id": 1,
"name": "Soap",
"price": "2.00",
"description": "It cleans things"
"category_list: [
{
"id":1,
"location": "store",
"name": "cleaner"
}, {
"id": 2,
"location": "online",
"name": "home"
}
]
}
В основном есть продукты, которые находятся в категориях.
Я указал на это индексатор, но когда я делаю запросы для продуктов, я получаю результаты, в которых «категории» разбиваются на отдельные списки
{
name: ["cleaner", "home"]
location: ["store", "online"]
id: [1, 2]
}
Он инвертирует отношения и теряет контекст. Если бы я хотел спросить его, где находится категория «магазин», а название «дом», он найдет ВСЕ, что имеет ЛЮБОЙ инвентарь в магазине, и ЛЮБУЮ категорию «дом». У него нет контекста, чтобы собрать его вместе в одном и том же подобъекте.
Есть ли способ указать solr правильно проиндексировать, сохранить и получить их? Я могу передать ему таблицы или json или что-то еще, но я хочу вернуть его в исходную форму и запросить его в исходной форме.
Так что data-config. xml похожа на this
<dataConfig>
<dataSource type="JdbcDataSource" driver="org.postgresql.Driver" url="jdbc:postgresql://pghostname:5432/db" user="user" password="pass" />
<document >
<entity name="products"
pk="id"
query="SELECT * from products">
<field column="id" name="id"/>
<field column="name" name="name"/>
<field column="price" name="price"/>
<field column="description" name="description"/>
<entity name="product_categories"
pk="category_id"
query="SELECT * from product_categories where product_id = ${product.id}">
<field column="category_id" name="category_id"/>
<field column="location" name="location"/>
<field column="name" name="name"/>
</entity>
</entity>
</document>
</dataConfig>
А вот несколько примеров данных для postgres базы данных
create table products (
id integer generated by default as identity,
name varchar,
price varchar,
description varchar,
primary key(id)
);
create table product_categories (
category_id integer generated by default as identity,
name varchar,
location varchar,
product_id integer,
foreign key (product_id) references products(id),
primary key(category_id)
);
insert into products
(name, price, description)
values
('Soap', '2.13', 'this is soap'),
('Pencils', '0.89', 'pencils write things'),
('Scissors', '5.00', 'scissors sciss');
insert into product_categories
(name, location, product_id)
values
('home', 'in-store', 1),
('office', 'online', 2),
('office', 'in-store', 3),
('home', 'in-store', 2);
Вы можете видеть, что существует одна связь. Но после импортирования этого и выполнения запроса мы видим результаты вроде ...
"response":{"numFound":3,"start":0,"docs":[
{
"price":"2.13",
"name":"Soap",
"description":"this is soap",
"id":"1",
"category_id":"1",
"location":"in-store",
"_version_":1658459282145804288},
...
, которые четко сведут две таблицы в один объект