从目标复制到复制字段时,Solr 拆分包含 URL 的字段
Solr splits a field containing a URL when copying from destination to a copyfield
我使用的是 Solr 4.5.1,我在 solr 中索引了这两个字段:
schema.xml
<field name="event_id" type="custom_string" indexed="true" stored="true" />
<field name="text" type="text_fr" indexed="true" multiValued="true" stored="true"/>
<copyField source="event_id" dest="text"/>
<fieldType name="text_fr" class="solr.TextField" positionIncrementGap="100">
<analyzer>
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<!-- normalisation des accents, cédilles, e dans l'o,...-->
<filter class="solr.ASCIIFoldingFilterFactory"/>
<!-- suppression des doublons éventuels -->
<filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
</analyzer>
</fieldType>
solrconfig.xml
<requestHandler name="/select" class="solr.SearchHandler">
<!-- default values for query parameters can be specified, these
will be overridden by parameters in the request
-->
<lst name="defaults">
<str name="echoParams">explicit</str>
<int name="rows">10</int>
<str name="df">text</str>
<!--Custom default for Iris -->
<str name="fl">id</str>
<str name="hl">on</str>
<str name="hl.simple.pre">[###</str>
<str name="hl.simple.post">###]</str>
<str name="hl.fl">event_id</str>
</lst>
</requestHandler>
正如您在 solrconfig.xml 中注意到的那样,我在 /select 请求处理程序上突出显示了字段 event_id,PS 字段 event_id 始终包含href.
例如,当我将 url 存储在 event_id 字段 "htp://XXX.ZZZ.WWW/OFF" 上时,我尝试使用此查询来查询它:
event_id:(htp\:\/\/XXX.ZZZ.WWW\/OFF)
我得到的结果是正确的:
{
"responseHeader": {
"status": 0,
"QTime": 11,
"params": {
"indent": "true",
"q": "event_id:(htp\:\/\/XXX.ZZZ.WWW\/OFF)",
"_": "1432653054406",
"wt": "json"
}
},
"response": {
"numFound": 2,
"start": 0,
"docs": [
{
"id": "ccb7f2bf-c758-4ebe-bcbe-48f73f43274d"
},
{
"id": "4f9386c9-a1fb-4918-b163-86ff20cb792f"
}
]
},
"highlighting": {
"ccb7f2bf-c758-4ebe-bcbe-48f73f43274d": {
"event_id": [
"[###htp://XXX.ZZZ.WWW/OFF###]"
]
},
"4f9386c9-a1fb-4918-b163-86ff20cb792f": {
"event_id": [
"[###htp://XXX.ZZZ.WWW/OFF###]"
]
}
}
}
但是当我尝试这个查询时:
text:(htp\:\/\/XXX.ZZZ.WWW\/OFF)
我得到这个结果:
{
"responseHeader": {
"status": 0,
"QTime": 9,
"params": {
"indent": "true",
"q": "text:(htp\:\/\/XXX.ZZZ.WWW\/OFF)",
"_": "1432653585146",
"wt": "json"
}
},
"response": {
"numFound": 2,
"start": 0,
"docs": [
{
"id": "ccb7f2bf-c758-4ebe-bcbe-48f73f43274d"
},
{
"id": "4f9386c9-a1fb-4918-b163-86ff20cb792f"
}
]
},
"highlighting": {
"ccb7f2bf-c758-4ebe-bcbe-48f73f43274d": {},
"4f9386c9-a1fb-4918-b163-86ff20cb792f": {}
}
}
并且如输出中所示,event_id 未突出显示,就我而言,我认为当 event_id 在 Solr 上被索引时,它被索引为字符串,当它被复制到文本时,由于分词器的存在,它被标记为 "htp"、"XXX.ZZZ.WWW" 和 "OFF",我认为这可能是我问题的根源,因为它当我索引一个简单的字符串(例如 event_id="OFF")而不是 url("http://...")时有效,你能帮我理解为什么吗?
复制的基本要求是类型要兼容。您的 event_id 是 custom_string 类型,我假设它是普通字符串。但是,文本的类型为 text_fr,它具有分词器和 filters。您可以尝试将两个字段设为 custom_string,除非您有特定要求使用分词器
我使用的是 Solr 4.5.1,我在 solr 中索引了这两个字段:
schema.xml
<field name="event_id" type="custom_string" indexed="true" stored="true" />
<field name="text" type="text_fr" indexed="true" multiValued="true" stored="true"/>
<copyField source="event_id" dest="text"/>
<fieldType name="text_fr" class="solr.TextField" positionIncrementGap="100">
<analyzer>
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<!-- normalisation des accents, cédilles, e dans l'o,...-->
<filter class="solr.ASCIIFoldingFilterFactory"/>
<!-- suppression des doublons éventuels -->
<filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
</analyzer>
</fieldType>
solrconfig.xml
<requestHandler name="/select" class="solr.SearchHandler">
<!-- default values for query parameters can be specified, these
will be overridden by parameters in the request
-->
<lst name="defaults">
<str name="echoParams">explicit</str>
<int name="rows">10</int>
<str name="df">text</str>
<!--Custom default for Iris -->
<str name="fl">id</str>
<str name="hl">on</str>
<str name="hl.simple.pre">[###</str>
<str name="hl.simple.post">###]</str>
<str name="hl.fl">event_id</str>
</lst>
</requestHandler>
正如您在 solrconfig.xml 中注意到的那样,我在 /select 请求处理程序上突出显示了字段 event_id,PS 字段 event_id 始终包含href.
例如,当我将 url 存储在 event_id 字段 "htp://XXX.ZZZ.WWW/OFF" 上时,我尝试使用此查询来查询它:
event_id:(htp\:\/\/XXX.ZZZ.WWW\/OFF)
我得到的结果是正确的:
{
"responseHeader": {
"status": 0,
"QTime": 11,
"params": {
"indent": "true",
"q": "event_id:(htp\:\/\/XXX.ZZZ.WWW\/OFF)",
"_": "1432653054406",
"wt": "json"
}
},
"response": {
"numFound": 2,
"start": 0,
"docs": [
{
"id": "ccb7f2bf-c758-4ebe-bcbe-48f73f43274d"
},
{
"id": "4f9386c9-a1fb-4918-b163-86ff20cb792f"
}
]
},
"highlighting": {
"ccb7f2bf-c758-4ebe-bcbe-48f73f43274d": {
"event_id": [
"[###htp://XXX.ZZZ.WWW/OFF###]"
]
},
"4f9386c9-a1fb-4918-b163-86ff20cb792f": {
"event_id": [
"[###htp://XXX.ZZZ.WWW/OFF###]"
]
}
}
}
但是当我尝试这个查询时:
text:(htp\:\/\/XXX.ZZZ.WWW\/OFF)
我得到这个结果:
{
"responseHeader": {
"status": 0,
"QTime": 9,
"params": {
"indent": "true",
"q": "text:(htp\:\/\/XXX.ZZZ.WWW\/OFF)",
"_": "1432653585146",
"wt": "json"
}
},
"response": {
"numFound": 2,
"start": 0,
"docs": [
{
"id": "ccb7f2bf-c758-4ebe-bcbe-48f73f43274d"
},
{
"id": "4f9386c9-a1fb-4918-b163-86ff20cb792f"
}
]
},
"highlighting": {
"ccb7f2bf-c758-4ebe-bcbe-48f73f43274d": {},
"4f9386c9-a1fb-4918-b163-86ff20cb792f": {}
}
}
并且如输出中所示,event_id 未突出显示,就我而言,我认为当 event_id 在 Solr 上被索引时,它被索引为字符串,当它被复制到文本时,由于分词器的存在,它被标记为 "htp"、"XXX.ZZZ.WWW" 和 "OFF",我认为这可能是我问题的根源,因为它当我索引一个简单的字符串(例如 event_id="OFF")而不是 url("http://...")时有效,你能帮我理解为什么吗?
复制的基本要求是类型要兼容。您的 event_id 是 custom_string 类型,我假设它是普通字符串。但是,文本的类型为 text_fr,它具有分词器和 filters。您可以尝试将两个字段设为 custom_string,除非您有特定要求使用分词器