Ответ на запрос фасета Solr 6.2.0, возвращающий вылитые результаты

Я создал новый основной и индексированный каталог из базы данных оракула, используя DIH. Индексация прошла успешно. Итак, теперь я пытаюсь запросить это, используя фасетный запрос, следующим образом.

Это моя структура данных была проиндексирована.

{
        "sku_display_name":"Men's Brooks Adrenaline GTS-rojo -7.5",
        "id":"sku10017",
        "product_id":"prod10004",
        "product_display_name":"pre-Prod_MEN'S Brooks Adrenaline GTS ",
        "category_id":"cat10016",
        "category_display_name":"preCat_Casual Shoes",
        "_version_":1592465895497662464
},
      {
        "sku_display_name":"MUJERES ADIDAS BOOST ULTRA NUEVO - marron-10",
        "id":"sku10016",
        "product_id":"prod10003",
        "product_display_name":"pre-Prod_MUJERES ADIDAS BOOST ULTRA NUEVO",
        "category_id":"cat10019",
        "category_display_name":"preCat_Casual Tennis",
        "_version_":1592465895517585408
}

Итак, мой запрос. localhost:8983/solr/TestCore/select?facet.field=category_display_name&facet.query=true&facet=on&indent=on&q=*:*&wt=json

Моя проблема заключается в ответе граней на значения фасетов. Ниже приведен мой ответ.

"facet_counts": {
      "facet_queries": {
         "true": 0
      },
      "facet_fields": {
         "category_display_name": [
            "shoes", -- But my actual facet value is *preCat_Casual Shoes*
            22,
            "precat_casual", -- But my actual facet value is *preCat_Casual 
            Shoes*
            15,
            "tennis",        -- preCat_Casual Tennis
            9,
         ]
      },
      "facet_ranges": {},
      "facet_intervals": {},
      "facet_heatmaps": {}
   }

Можете ли вы помочь мне выбраться из этого? В соответствии с этим поведением оно разбивается, если значение фасета имеет пробел.


person spartans    schedule 15.02.2018    source источник
comment
Можете ли вы сказать, каков тип category_display_name ? это string или text ?   -  person Nomade    schedule 15.02.2018
comment
Это тип text_ar   -  person spartans    schedule 15.02.2018


Ответы (2)


Когда вы индексируете текстовое поле с определенным токенизатором (это не KeywordTokenizer), содержимое разбивается на отдельные токены на основе определенных наборов правил. Для StandardTokenizer это означает, что содержимое разделено на пробелы и несколько других специальных символов.

Поскольку вам нужно полное значение, вы можете использовать TextField с KeywordTokenizer (если вы также хотите иметь фильтр нижнего регистра, чтобы регистр не имел значения), или если вы хотите, чтобы регистр был значимым, используйте поле string вместо TextField с определен анализ и цепочка токенизатора.

person MatsLindh    schedule 15.02.2018

Проблема здесь заключается в разделении пробела, поэтому, чтобы исправить это, вам нужно изменить конфигурацию вашего типа (кажется, text с WordDelimiterFilterFactory), чтобы предотвратить разделение Solr в пространстве. Для этого перейдите в свой \solr\schema.xml и отредактируйте свой тип, удалив этот фильтр <filter .... class="solr.WordDelimiterFilterFactory" ..>.

Второй - это преобразование результатов в нижнем регистре, чтобы исправить это, я предлагаю удалить следующий фильтр: <filter class="solr.LowerCaseFilterFactory" />.

И если вы используете text_ar, вам нужно изменить его на text_en, а не string, string почти зарезервировано для кодов или идентификаторов, потому что оно соответствует тому же слову!

person Nomade    schedule 15.02.2018
comment
У меня нет WordDelimiterFilterFactory в моем определении, также второй случай также не работает, однако удаление LowerCaseFilterFactory. Пожалуйста, дайте мне знать, что вас беспокоит. ‹fieldType name=text_arclass=solr.TextFieldpositionIncrementGap=100›‹analyzer type=index›‹tokenizer class=solr.StandardTokenizerFactory/›‹filter class=solr.LowerCaseFilterFactory/› ‹filter class=solr.StopFilterFactory words=lang/stopwords_ar.txt ignoreCase=true/›‹filter class=solr.ArabicNormalizationFilterFactory/› ‹filter class=solr.ArabicStemFilterFactory/› ‹/analyzer› ‹/fieldType› - person spartans; 15.02.2018
comment
Это странное поведение, но зачем использовать конфигурацию Arabic для поля с Latin символами? Вы можете поделиться конфигурацией <fieldType name="text" ...>? - person Nomade; 15.02.2018
comment
Эта конфигурация пришла из пакета solr. - person spartans; 15.02.2018
comment
‹имя поля=category_display_name type=text_ar indexed=true Stored=true/› ‹field name=category_id type=text_ar indexed=true Stored=true/› - person spartans; 15.02.2018
comment
Спасибо nomade .. Я исправил, изменив тип с text_ar на строку. ‹имя поля=category_display_name type=string indexed=true хранить=true/› ‹field name=category_id type=string indexed=true хранить=true/› ‹field name=product_display_name type=string indexed=true хранить=true/› ‹поле name=product_id type=string indexed=true хранить=true/› ‹имя поля=sku_description type=string indexed=true хранить=true/› ‹field name=sku_display_name type=string indexed=true хранить=true/› Спасибо.. - person spartans; 15.02.2018
comment
Итак, вам нужно изменить <field name="category_display_name" type="text_ar" ... на <field name="category_display_name" type="text_en" ... - person Nomade; 15.02.2018
comment
И мой ответ выглядит следующим образом. - person spartans; 15.02.2018
comment
Итак, вам нужно изменить ‹field name=category_display_name type=text_ar... на ‹field name=category_display_name type=text_en... Not text_en вместо того, чтобы использовать type=string.. Спасибо.. - person spartans; 15.02.2018
comment
Проверьте мое редактирование, чтобы понять, почему в этом случае мы не должны использовать строку в качестве типа. - person Nomade; 15.02.2018
comment
Привет, номаде.. мое определение schema.xml выглядит так, как показано ниже. txt ignoreCase=true/› ‹filter class=solr.EnglishPossessiveFilterFactory/› ‹filter class=solr.KeywordMarkerFilterFactory protected=protwords.txt/› ‹filter class=solr.PorterStemFilterFactory/› Я все еще сталкиваюсь с проблемой разделения, если использую text_en. Итак, какой токенизатор я должен использовать, чтобы получить фактическое значение фасетов? - person spartans; 16.02.2018
comment
Также я использовал ‹tokenizer class=solr.KeywordTokenizerFactory/›, так как узнал, что вернет фактическое значение. Но, тем не менее, он возвращает приведенные ниже результаты в Индексированных фактических результатах: preCat_Casual Shoes Возвращенные результаты: preCat_Casual Sho Он просто объединяет два последних символа. Пожалуйста, дайте мне знать, если вам нужна дополнительная информация. - person spartans; 16.02.2018
comment
Можете ли вы попробовать добавить эту конфигурацию ` ‹filter class=solr.WordDelimiterFilterFactory splitOnNumerics=0 generateWordParts=0 generateNumberParts=0 catenateWords=0 catenateNumbers=0 catenateAll=0 splitOnCaseChange=0 /›` - person Nomade; 16.02.2018
comment
Привет, если я добавлю вышеуказанный фильтр.. вообще не возвращаются результаты фасетов.. facet_counts:{facet_queries:{true:0}, facet_fields:{category_display_name:[]}, facet_ranges:{}, facet_intervals:{}, facet_heatmaps:{ }}} - person spartans; 16.02.2018