2016-07-23 5 views
2

DataImportHandler를 사용하여 SQL 데이터베이스와 동기화 된 색인을 유지하려고합니다 (바닐라 일을하는 것). 데이터베이스가 꽤 커질 것이므로이 메서드 http://wiki.apache.org/solr/DataImportHandlerDeltaQueryViaFullImport을 사용하여 점진적 가져 오기를 사용하고 있으므로 호출의 형식은 http://localhost:8983/solr/Items/dataimport?command=full-import&clean=false입니다. 이것은 항목을 추가 할 때 완벽하게 작동합니다. 사용자 정의 전체 가져 오기로 Solr 삭제

나는 그들이 삭제 된 경우와 함께, 항목에서 테이블을 삭제 된 항목의 기본 키를 포함 내 데이터베이스에 별도의 DeletedItems에 테이블이 있습니다. DataImport 호출의 일환으로, 나는

SELECT Id FROM DeletedItems WHERE WasDeletedOn > '${dataimporter.last_index_time}' 

의 라인을 따라 쿼리를 기반으로 내 인덱스에서 관련 항목을 삭제할 수 있기를 기대했다 그러나 나는이 작업을 수행하는 방법을 알아낼 수 없습니다. 위의 링크는 암시 적으로이를 암시합니다.

이 경우에는 deletedPkQuery를 사용하려는 경우에도 delta-import 명령을 계속 실행해야하는 경우에 대비해야합니다.

위의 SQL 쿼리에 deletedPkQuery를 설정해도 작동하지 않는 것 같습니다. 그런 다음 deletedPkQuery가 델타 가져 오기에서만 작동하므로 동기화 프로세스의 일부로 내 solr 서버에 두 가지 요청을해야한다는 내용을 읽었습니까? 이 작업은 변경되는 dataimporter.last_index_time 속성에 의해 매개 변수화되어 있으므로 올바르게 표시되지 않습니다. 두 단계 모두 하나의 "원자"행동으로 수행되어야합니다. 어떤 아이디어?

답변

0

deletedPkQuerydelta-import에 대한 일반 호출의 일부로 실행되므로 두 번 아무것도 실행할 필요가 없습니다. 전체 가져 오기를 수행 할 때 전체 연결이 해제되기 전에 deletedPkQuery를 실행할 필요가 없습니다. 어쨌든 가져 오기).

deletedPkQuery은 기본 쿼리와 동일한 요소에 구성되어야합니다. 필드 이름도 정확히 일치해야하며 deletedPkQuery에서 생성 한 id은 기본 쿼리에서 제공 한 것과 일치해야합니다.

<entity 
    name="album" 
    query="SELECT * from albums" 
    deletedPkQuery="SELECT deleted_id as id FROM deletes WHERE deleted_at > '${dataimporter.last_index_time}'" 
> 

또한 deleted_at 필드의 형식은 last_index_time에 의해 생성 된 값과 비교할 수 있는지 확인 : 당신이 여기 가지고

수입과 같은 deleted_entries 테이블 구조를 사용하여 필드를 삭제하는 a minimal example on solr.pl을있다. The default isyyyy-MM-dd HH:mm:ss.

.. 그리고 마지막으로, 더 "이전 색인 시간"처음 인덱스가 채워지는 없다 이후 last_index_time 속성, 작업이 실행되는 두 번째 시간 이전에 사용할 수없는 기억 (그러나 deletedPkQuery가 안 어쨌든 그 전에 실행).

+0

감사합니다. 델타 가져 오기를 피하려고합니다. 델타 쿼리가 반환 한 각 PK (즉, n + 1)가 하나 일 때 데이터베이스에 대한 호출을 실행하는 것처럼 보입니다. Solr 설명서에서 "참고 : Solr에서 문서를 업데이트하는 다른 방법이 있습니다.이 방법은 많은 경우 효율적이며 http://wiki.apache.org/solr/DataImportHandlerDeltaQueryViaFullImport에서 설명 된 구성도 필요 없습니다." 그들이 여기서 설명하는 방법은 증분 가져 오기에 매우 적합하지만 삭제 의도가 어떻게 구성되는지 이해할 수 없습니다. –

+0

참고로, 전체 가져 오기는 사용되지만 색인을 지우지 않고 문서를 추가/업데이트합니다. –

+0

아, 좋은 지적입니다. 나는 그 세부 사항을 놓쳤다. 나는 당신이 두 가지 명령을 내 보내야한다고 생각합니다. 하나는 전체 가져 오기를위한 것이고, 하나는 델타 가져 오기가 나중에 삭제를 시작하는 것입니다. 전체 가져 오기를 사용하는 삭제는 일반적으로'clean = true'를 사용하여 처리됩니다. DeltaQueryViaFullImport에 설명 된 기술로 삭제 작업을 수행하려면 삭제 된 필드를 통해 수동으로 처리해야합니다. 삭제 된 필드는 이후에 deleteByQuery로 삭제하거나 삭제를 트리거하는 델타 가져 오기 쿼리를 통해 제거해야합니다. 가져 오기간에 얼마나 많은 문서를 삭제하고 있습니까? – MatsLindh

0

당신은 당신이 부스트를 변경하거나 전체 가져 오기 쿼리의 레코드에서 오는 문서를 삭제할 수 있습니다 가져 오기 핸들러에게 특별한 명령이 명령으로

https://wiki.apache.org/solr/DataImportHandler#Special_Commands

를 사용해야합니다. 문서가 다시 인덱싱되지 않도록 $ skipDoc 필드를 사용해야하고 $ deleteDocById 필드에서 id를 반복해야한다는 점에 유의하십시오.

당신은 통합 쿼리

select 
    id, 
    text, 
    'false' as [$deleteDocById], 
    'false' as [$skipDoc] 
from [rows to update or add] 
Union Select 
    id, 
    '' as text, 
    id as [$deleteDocById], 
    true as [$skipDoc] 

또는 케이스를 사용할 수있을 때 답장을

select 
    id, 
    text, 
    CASE 
    when deleted = 1 then id 
    else 'false' 
    END as [$deleteDocById], 
    CASE 
    when deleted = 1 then 'true' 
    else 'false' 
    END as [$skipDoc] 
    Where updated > ${dih.last_index_time}