Нужны точные совпадения в результатах поиска solr - PullRequest
0 голосов
/ 17 января 2020

В настоящее время я сталкиваюсь со следующей небольшой проблемой при выполнении точного поиска (запрос заключен в двойные кавычки).

{
  "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>

1 Ответ

0 голосов
/ 18 января 2020

Использование двойных кавычек не означает точное . Это позволяет вам только делать фразы, когда термины должны появляться после друг друга. Solr (Lucene) выполняет поиск по сгенерированным токенам .

Используйте поле с определением c, которое не меняет токены (т. Е. Нет нграмм, нет стемминга и т. Д. c). Если вы хотите точно соответствовать всему полю (но без учета регистра), используйте KeywordTokenizer с LowercaseFilter. Если вы хотите, чтобы регистр учитывался только с учетом регистра, используйте поле string.

Если вам нужны точные совпадения с каждым термином, используйте токенизатор с нужным вам поведением и выберите фильтры, чтобы нормализовать регистр (т. Е. Сделать его нечувствительным к регистру) или нет. Затем вы решаете, какое поле запрашивать, основываясь на том, запрашивает ли пользователь точный поиск.

Вам нужно будет определить, как должен вести себя "foo" bar и как должен вести себя "foo bar" baz. .

...