Solr 部分搜索
Solr partial search
(这里是 Solr 新手)我设置了一个简单的 solr 实例来索引 html/pdf 文档的集合。它基本上可以工作,但我一直在尝试添加 部分搜索 功能。
到目前为止我尝试了什么:
因为我认为最好保留默认的托管模式,所以我尝试使用模式 api 添加一个字段 text_partial
和 ngram 过滤器,就像那样。
curl -X POST -H 'Content-type:application/json' --data-binary '{
"add-field-type":{
"name":"text_ngram",
"class":"solr.TextField",
"positionIncrementGap":"100",
"indexAnalyzer":{
"tokenizer":{
"class":"solr.WhitespaceTokenizerFactory"
},
"filters": [
{"class":"solr.LowerCaseFilterFactory"},
{
"class":"solr.NGramTokenizerFactory",
"maxGramSize":"25",
"minGramSize":"3",
}
]
},
"queryAnalyzer":{
"tokenizer":{
"class":"solr.WhitespaceTokenizerFactory"},
"filters":[
{"class":"solr.LowerCaseFilterFactory"}]}
},
"add-field":{
"name": "text_partial",
"type": "text_ngram",
"indexed": true,
"stored": true
}
}' http://127.0.0.1:8983/solr/my_collection/schema
我尝试删除所有文档并重新编制索引,但我看不出与之前有什么不同:全词搜索仍然有效,但查询 "text_partial:something" 没有结果。
然后我意识到我没有对我的 DataImportHandler 做任何修改,目前就是这样
<dataConfig>
<dataSource type="BinFileDataSource" />
<document>
<entity name="files" dataSource="null" rootEntity="false"
processor="FileListEntityProcessor"
baseDir="C:/xampp/htdocs/tcdocs12" fileName=".*\.(html|pdf)"
onError="skip"
recursive="true">
<field column="fileAbsolutePath" name="id" />
<field column="fileSize" name="size" />
<field column="fileLastModified" name="lastModified" />
<entity
name="documentImport"
processor="TikaEntityProcessor"
url="${files.fileAbsolutePath}"
format="text"
transformer="TemplateTransformer,RegexTransformer"
>
<field column="file" name="fileName"/>
<field column="Author" name="author" meta="true"/>
<field column="title" name="title" meta="true"/>
<field column="text" name="text"/>
<field column="tempCol" template="${files.fileAbsolutePath}" regex="${dataimporter.request.docs_dir}(.*)" replaceWith=""/>
<field column="url" regex="\" replaceWith="/" sourceColName="tempCol"/>
<field column="cat" regex="^\/.+?\/(.+?)\/.*" replaceWith="" sourceColName="url"/>
</entity>
</entity>
</document>
</dataConfig>
我是否必须对 DIH 或架构进行任何修改才能使 "the document text content" 也在 "text_partial" 字段中进行处理和索引?
内容没有神奇地添加到字段中。如果您已经将内容索引到一个字段中,例如名为 text
的字段,您可以添加一条 copyField
指令以有效地将相同内容索引到两个具有不同处理的字段中。
参见Add a new copy field rule in the Schema API:
curl -X POST -H 'Content-type:application/json' --data-binary '{
"add-copy-field":{
"source":"text",
"dest":[ "text_partial" ]}
}' http://localhost:8983/solr/my_collection/schema
您需要在添加此规则后重新编制索引,因为复制发生在编制索引时的任何进一步处理之前。
(这里是 Solr 新手)我设置了一个简单的 solr 实例来索引 html/pdf 文档的集合。它基本上可以工作,但我一直在尝试添加 部分搜索 功能。
到目前为止我尝试了什么:
因为我认为最好保留默认的托管模式,所以我尝试使用模式 api 添加一个字段 text_partial
和 ngram 过滤器,就像那样。
curl -X POST -H 'Content-type:application/json' --data-binary '{
"add-field-type":{
"name":"text_ngram",
"class":"solr.TextField",
"positionIncrementGap":"100",
"indexAnalyzer":{
"tokenizer":{
"class":"solr.WhitespaceTokenizerFactory"
},
"filters": [
{"class":"solr.LowerCaseFilterFactory"},
{
"class":"solr.NGramTokenizerFactory",
"maxGramSize":"25",
"minGramSize":"3",
}
]
},
"queryAnalyzer":{
"tokenizer":{
"class":"solr.WhitespaceTokenizerFactory"},
"filters":[
{"class":"solr.LowerCaseFilterFactory"}]}
},
"add-field":{
"name": "text_partial",
"type": "text_ngram",
"indexed": true,
"stored": true
}
}' http://127.0.0.1:8983/solr/my_collection/schema
我尝试删除所有文档并重新编制索引,但我看不出与之前有什么不同:全词搜索仍然有效,但查询 "text_partial:something" 没有结果。
然后我意识到我没有对我的 DataImportHandler 做任何修改,目前就是这样
<dataConfig>
<dataSource type="BinFileDataSource" />
<document>
<entity name="files" dataSource="null" rootEntity="false"
processor="FileListEntityProcessor"
baseDir="C:/xampp/htdocs/tcdocs12" fileName=".*\.(html|pdf)"
onError="skip"
recursive="true">
<field column="fileAbsolutePath" name="id" />
<field column="fileSize" name="size" />
<field column="fileLastModified" name="lastModified" />
<entity
name="documentImport"
processor="TikaEntityProcessor"
url="${files.fileAbsolutePath}"
format="text"
transformer="TemplateTransformer,RegexTransformer"
>
<field column="file" name="fileName"/>
<field column="Author" name="author" meta="true"/>
<field column="title" name="title" meta="true"/>
<field column="text" name="text"/>
<field column="tempCol" template="${files.fileAbsolutePath}" regex="${dataimporter.request.docs_dir}(.*)" replaceWith=""/>
<field column="url" regex="\" replaceWith="/" sourceColName="tempCol"/>
<field column="cat" regex="^\/.+?\/(.+?)\/.*" replaceWith="" sourceColName="url"/>
</entity>
</entity>
</document>
</dataConfig>
我是否必须对 DIH 或架构进行任何修改才能使 "the document text content" 也在 "text_partial" 字段中进行处理和索引?
内容没有神奇地添加到字段中。如果您已经将内容索引到一个字段中,例如名为 text
的字段,您可以添加一条 copyField
指令以有效地将相同内容索引到两个具有不同处理的字段中。
参见Add a new copy field rule in the Schema API:
curl -X POST -H 'Content-type:application/json' --data-binary '{
"add-copy-field":{
"source":"text",
"dest":[ "text_partial" ]}
}' http://localhost:8983/solr/my_collection/schema
您需要在添加此规则后重新编制索引,因为复制发生在编制索引时的任何进一步处理之前。