我正在实施SOLR搜索。当我输入“abc def”时,我希望获得包含“abc def”的所有段落。例如,如果我有这些段落。
{
"paragraphs": ["abc def. bdbdbdbdbd, aa", "abd efe"]
},
{
"paragraphs": ["xyzabc def xyz", "fgh xx", "abcdef", "wwwabc defxxx"]
}
我想从第一个获取数据。完全匹配此词组,因此不是另一个词组的一部分。如果我搜索“神狗”短语“神狗狗”不应该包含在结果中。
问题是当我尝试使用查询paragraphs : "abc def"
时,我得到空的结果。
这是我的schema.xml的一部分:
<field name="paragraphs" type="text" indexed="true" stored="true" required="true" multiValued="true"/>
<types>
<fieldType name="text" class="solr.TextField" sortMissingLast="true" omitNorms="true">
<analyzer type="index">
<tokenizer class="solr.KeywordTokenizerFactory"/>
<filter class="solr.ASCIIFoldingFilterFactory" preserveOriginal="true"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.KeywordTokenizerFactory"/>
<filter class="solr.ASCIIFoldingFilterFactory" preserveOriginal="true">
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
</types>
我尝试使用StandardTokenizerFactory而不是KeywordTokenizerFactory,但结果是相同的。我可以使用(*abc*)
获取数据,但这会返回xabcz
等元素,我对此不感兴趣。
答案 0 :(得分:1)
您必须删除KeywordTokenizer - 这会将整个存储的文本保留为单个标记。
使用WhitespaceTokenizer或StandardTokenizer应该有效,请记住在以任何方式更改分析链之后必须重新索引(除非您只是更改了内容的处理方式以进行查询)。
使用默认动态字段*_txt
(定义为仅使用小写和删除停用词的StandardTokenizer),并将您的两个文档编入索引:
<强> q=*:*
强>
"response":{"numFound":2,"start":0,"docs":[
{
"paragraphs_txt":["abc def. bdbdbdbdbd, aa",
"abd efe"],
"id":"d696c435-2267-442d-9abe-ea754793d5cf",
"_version_":1602547400543567872},
{
"paragraphs_txt":["xyzabc def xyz",
"fgh xx",
"abcdef",
"wwwabc defxxx"],
"id":"09bbba7c-b407-403c-9771-582ef23f6b56",
"_version_":1602547400598093824}]
}}
<强> q=paragraphcs_txt:"abc def"
强>
"response":{"numFound":1,"start":0,"docs":[
{
"paragraphs_txt":["abc def. bdbdbdbdbd, aa",
"abd efe"],
"id":"d696c435-2267-442d-9abe-ea754793d5cf",
"_version_":1602547400543567872}]
}}