2013-02-15 4 views
0

Я использую Solr 4.0 DIH (разъем JDBC) на Ubuntu. Я пытаюсь сделать следующий MySQL JOIN работу запроса с Solr на Delta-import:Solr 4.0 Delta-import 3 таблицы join

select c.*,u.*,g.* from user u inner join group g on u.bus_grp_id = g.dt_grp_id inner join customer c on c.id = g.dt_id 

Здесь с, и, г являются псевдонимами таблиц customer, user и group соответственно.

Ниже data-config.xml файла для полного и дельты импорта:

<entity name="cust" pk="id" query="select c.*,u.*,g.* from user u inner join group g on u.bus_grp_id = g.dt_grp_id inner join customer c on c.id = g.dt_id" 
       deltaImportQuery="select c.*,u.*,g.* from user u inner join group g on u.bus_grp_id = g.dt_grp_id inner join customer c on c.id = g.dt_id where c.id='${dih.delta.c.id}'" 
       deltaQuery="select id from customer where last_modified &gt; '${dih.last_index_time}'"> 

       <entity name="grp" pk="dt_id" 
        query="select * from group where dt_id='${cust.c.id}'" 
        deltaQuery="select dt_id from group where last_modified > '${dih.last_index_time}'" 
        parentDeltaQuery="select id from customer where id=${grp.dt_id}" > 

       <entity name="usr" pk="bus_grp_id" 
       query="select * from user" 
       deltaQuery="select bus_grp_id from user where last_modified > '${dih.last_index_time}'" 
       parentDeltaQuery="select dt_grp_id from group where dt_grp_id=${usr.bus_grp_id}" > 

</entity> 
</entity> 
</entity> 

full-import в порядке, но Delta-import не работает (я не получаю никаких результатов после импорта дельты). Прошло почти месяц с тех пор, как я пытался сделать эту работу, но не мог.

Любая помощь? пожалуйста!

+0

Посмотрите здесь: http://wiki.apache.org/solr/DataImportHandlerDeltaQueryViaFullImport Надеюсь, что это поможет. – vuky

ответ

0

Если запрос в основной элемент сущности, т.е.

select c.*,u.*,g.* from user u 
inner join group g on u.bus_grp_id = g.dt_grp_id 
inner join customer c on c.id = g.dt_id 

дает вам все поля, которые нужно проиндексировать в Solr, я не думаю, что вам нужно два других суб-объекты. Также я предполагаю, что в deltaImportQuery есть опечатка. Вы должны использовать dih.delta.id, а не dih.delta.c.id.

Я думаю, если вы держите только это, он должен работать нормально:

<entity 
    name="cust" 
    pk="id" 
    query="select c.*,u.*,g.* from user u 
      inner join group g on u.bus_grp_id = g.dt_grp_id 
      inner join customer c on c.id = g.dt_id" 
    deltaImportQuery="select c.*,u.*,g.* from user u 
      inner join group g on u.bus_grp_id = g.dt_grp_id 
      inner join customer c on c.id = g.dt_id 
       where c.id='${dih.delta.id}'" 
    deltaQuery="select id from customer 
       where last_modified &gt; '${dih.last_index_time}'" /> 

Как только вы делаете полный импорт, проверьте файл dataimport.properties. После завершения полного импорта убедитесь, что у вас есть документы в таблице customer с last_modified больше, чем время, которое вы находите в dataimport.properties, поэтому у дельты есть некоторые данные для запуска. Затем попробуйте дельта-импорт и посмотрите, будут ли эти документы переиндексированы. Вы можете узнать, сколько из них было проиндексировано с дельта-импортом, посмотрев на http://HOST:PORT/solr/CORE/dataimport

+0

ОК .. Я пробую так! – user465465

+0

Да, это зависит от того, чего вы пытаетесь достичь. Вы хотите, чтобы у каждого клиента в вашей базе данных был один документ Solr? Или вы хотите иметь один документ для каждого пользователя в вашей базе данных? (учитывая мощность вашего пользователя клиента (1-n) группы пользователей (1-n)) –

+0

Да, я хочу один документ для всех трех таблиц. Я просто хочу, чтобы запрос соединения работал точно так, как он работает при запросе в базе данных. – user465465