我遇到一个问题,Solr在完全导入过程中不会清除索引。
所有服务器都运行Solr 3.4,配置尽可能的香草。
我在我们的开发环境和我自己的计算机上的实例上尝试了这个,并且收到了类似的结果。
架构相当简单,这些是重点:
<schema name="System" version="1.4">
...
</types>
<fieldType name="string" class="solr.StrField" sortMissingLast="true" omitNorms="true" />
<fieldType name="long" class="solr.TrieLongField" precisionStep="0" omitNorms="true" positionIncrementGap="0" />
<fieldType name="date" class="solr.TrieDateField" omitNorms="true" precisionStep="0" positionIncrementGap="0" />
<fieldType name="documentKey" class="solr.TextField">
<analyzer type="index">
<tokenizer class="solr.KeywordTokenizerFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.KeywordTokenizerFactory"/>
</analyzer>
</fieldType>
</types>
<fields>
<field name="document_id" type="documentKey" indexed="true" stored="true" required="true" />
<field name="entity_id" type="long" indexed="true" stored="true" required="true" />
<field name="name" type="string" indexed="true" stored="true" required="true" />
<field name="entity_type" type="string" indexed="true" stored="true" required="false" />
<field name="Timestamp" type="date" indexed="true" stored="true" default="NOW" multiValued="false"/>
</fields>
</schema>
值得注意的是: - document_id字段在物化视图中计算,该视图用于填充索引,并且是不在此索引中的其他字段的组合,但与entity_id无关。这是独一无二的。 - entity_id字段是几个表的键,对于同一个document_id,它可以在刷新和另一个表之间疯狂地改变。
在完全刷新之前,如果我这样查询索引:
http://localhost:8080/qq-solr/system/select/?rows=10&q=document_id:%22French_Polynesia/Huahine~4034376%22
我明白了:
<?xml version="1.0" encoding="UTF-8"?>
<response>
<lst name="responseHeader">
<int name="status">0</int>
<int name="QTime">5</int>
<lst name="params">
<str name="indent">true</str>
<str name="q">document_id:"French_Polynesia/Huahine~4034376"</str>
<str name="rows">10</str>
</lst>
</lst>
<result name="response" numFound="1" start="0">
<doc>
<date name="Timestamp">2012-03-08T09:47:26.335Z</date>
<str name="document_id">French_Polynesia/Huahine~4034376</str>
<long name="entity_id">22902728</long>
<str name="name">Huahine</str>
<str name="type">LOCATION</str>
</doc>
</result>
</response>
然后我刷新:
http://localhost:8080/qq-solr/system/dataimport?command=full-import&clean=true&commit=true&optimize=true
(我知道干净,提交和优化是多余的,但我只是为了确保它们使用它们)并且过了一段时间后我得到的消息是一切都好了。
然后我再次查询索引:
http://localhost:8080/qq-solr/system/select/?rows=10&q=document_id:%22French_Polynesia/Huahine~4034376%22
我得到了:
<?xml version="1.0" encoding="UTF-8"?>
<response>
<lst name="responseHeader">
<int name="status">0</int>
<int name="QTime">5</int>
<lst name="params">
<str name="indent">true</str>
<str name="q">document_id:"French_Polynesia/Huahine~4034376"</str>
<str name="rows">10</str>
</lst>
</lst>
<result name="response" numFound="1" start="0">
<doc>
<date name="Timestamp">2012-03-09T08:31:07.317Z</date>
<str name="document_id">French_Polynesia/Huahine~4034376</str>
<long name="entity_id">22902728</long>
<str name="name">Huahine</str>
<str name="type">LOCATION</str>
</doc>
</result>
</response>
但是在数据库中,entity_id是不同的!
我看到时间戳已更新,因此触摸了记录,但为什么保留旧值?
答案 0 :(得分:0)
我将通过Interactive Development Mode运行DataImportHandler(DIH)进程,以便确保数据库查询正在检索您期望的entity_id。因为正在更新solr条目的时间戳,所以你的DIH进程正在运行,但我猜测其原因在于检索数据的方式。
答案 1 :(得分:0)
每当我使用Solr进行这样的操作时,我总是首先使用curl手动清除索引,以确保100%擦除。这是一个教程:http://www.alphadevx.com/a/365-Clearing-a-Solr-search-index