В настоящее время я сталкиваюсь со следующей небольшой проблемой при выполнении точного поиска (запрос заключен в двойные кавычки).
{
"responseHeader": {
"status": 0,
"QTime": 1,
"params": {
"q": "\"sale\"",
"indent": "true",
"fl": "displayValue, categoryName, approved, averageRating, lastOneWeekCount, connectorName, score",
"wt": "json",
"_": "1579279511471"
}
},
"response": {
"numFound": 918,
"start": 0,
"maxScore": 11.044312,
"docs": [
{
"displayValue": "Net Sales Vs Contribution Margin",
"categoryName": "Sales Analytics (B07)",
"connectorName": "New BOBJ",
"lastOneWeekCount": 3,
"approved": "yes",
"averageRating": 4,
"score": 11.044312
},
Приведенный выше запрос "продажа" соответствует термину "Продажи" в проиндексированных данных , который не является точным. Также это происходит из-за EdgeNgramFilterFactory, который находится в определенном текстовом поле (в котором используется пробел-пробел). Мне удалось постепенно решить различные проблемы поиска с помощью текущей реализации обработчика запросов выбора, и теперь мне нужно решить вышеупомянутую проблему точного соответствия. Ниже приведены мои данные для solrconfig.
<lst name="defaults">
<str name="exact">false</str>
<str name="echoParams">explicit</str>
<int name="rows">10</int>
<str name="defType">edismax</str>
<str name="qf">
displayValue^20 description^5 connectorName_txt zenDescription_txt^5 zenBusinessOwner_txt^2
categoryName^8 reportOwner^2 reportDetailsNameColumn^5
</str>
<str name="pf2">
displayValue^20 description^5 connectorName_txt zenDescription_txt^5 zenBusinessOwner_txt^2
categoryName^8 reportOwner^2 reportDetailsNameColumn^5
</str>
<str name="pf3">
displayValue^20 description^5 connectorName_txt zenDescription_txt^5 zenBusinessOwner_txt^2
categoryName^8 reportOwner^2 reportDetailsNameColumn^5
</str>
<str name="tie">1</str>
<str name="mm">100%</str>
<int name="ps2">3</int>
<int name="ps3">9</int>
<int name="qs">0</int>
<str name="df">text</str>
<str name="q.alt">*:*</str>
<str name="sort">score desc, averageRating desc, lastOneWeekCount desc</str>
<str name="bq">
query({!boost b=20}approved:"yes")
</str>
</lst>
<lst name="appends">
<str name="fq">{!switch case.false='*:*' case.true='text_ex:$q' v=$exact}</str>
</lst>
</requestHandler>
В приведенных выше подробностях конфигурации я попытался решить проблему точного поиска, добавив в конфигурацию дополнительный синтаксический анализатор запросов на переключение (после поиска net). По сути, я хочу реализовать точный поиск, если пользовательский запрос имеет двойные кавычки. Я хотел реализовать точный поиск, когда пользователь указывает точный = true, используя синтаксический анализатор запросов. Но я застрял, потому что я не получаю никаких результатов. Может кто-нибудь помочь, пожалуйста?
PS Прикрепление определения схемы тоже. Пожалуйста, проверьте.
<fieldType name="text_ws" class="solr.TextField" omitNorms="false">
<analyzer type="index" omitTermFreqAndPositions="false">
<charFilter class="solr.MappingCharFilterFactory" mapping="mapping-FoldToASCII.txt"/>
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory" />
<filter class="solr.EdgeNGramFilterFactory" minGramSize="1" maxGramSize="15"/>
<filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
</analyzer>
<analyzer type="query">
<charFilter class="solr.MappingCharFilterFactory" mapping="mapping-FoldToASCII.txt"/>
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory" />
</analyzer>
</fieldType>
<fieldType name="text_exact" class="solr.TextField" omitNorms="false">
<analyzer type="index" omitTermFreqAndPositions="false">
<charFilter class="solr.MappingCharFilterFactory" mapping="mapping-FoldToASCII.txt"/>
<tokenizer class="solr.KeywordTokenizerFactory"/>
<filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="0"
catenateWords="0" catenateNumbers="0" preserveOriginal="1" catenateAll="0" splitOnCaseChange="0"/>
<filter class="solr.LowerCaseFilterFactory" />
<filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
</analyzer>
<analyzer type="query">
<charFilter class="solr.MappingCharFilterFactory" mapping="mapping-FoldToASCII.txt"/>
<tokenizer class="solr.KeywordTokenizerFactory"/>
<filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="0"
catenateWords="0" catenateNumbers="0" preserveOriginal="1" catenateAll="0" splitOnCaseChange="0"/>
<filter class="solr.LowerCaseFilterFactory" />
</analyzer>
</fieldType>