Как я искал бы пустые фасеты во много ценном фасетном поле и в то же время в Solr?

У меня есть приложение, где пользователи могут выбрать автозапчасти. Они выбирают свой механизм и затем выбирают атрибуты механизма как фасеты. После того, как они выберут свой механизм, они могут выбрать фасеты как объем двигателя, например, для сужения списка результатов. Проблема была, не, все документы имеют объем двигателя (это - пустое значение в Solr), поскольку это не имеет значения для всех частей. Например, объем двигателя редко имеет значение для воздушного фильтра. Таким образом, даже если пользователь выбрал 3.5L для их объема двигателя, я все еще хотел показать воздушные фильтры на экране как возможная часть, которую мог выбрать пользователь. Я сделал некоторый поиск, и следующий фасетный запрос работает отлично:

enginesize:"3.5" OR enginesize:(*:* AND -enginesize:[* TO *]) 

Этот запрос соответствовал бы или 3.5 или будет соответствовать записям, где не было никакого значения для поля объема двигателя (никакое значение не означало, что не имело значения, и это соответствует автомобилю).Прекрасно...

ПРОБЛЕМА: Я недавно сделал поля атрибута механизма многозначными полями, таким образом, я мог сохранить атрибуты для каждой части как список. Я затем применил фасетирование к нему, и это хорошо работало. Однако проблема подошла, когда я применил запрос, ранее упомянутый выше. В то время как выбор фасета enginesize сузил количество документов, отображенных только к документам, которые имеют тот объем двигателя, записи (я также использую запись слова для значения документа), который имел пустые значения (т.е."".), поскольку enginesize не появлялись. Тот же запрос выше не работает на многозначные фасеты тем же путем, он сделал, когда enginesize был единственным ценным полем.

Пример:

 <doc> 
  <str name="part">engine mount</str>
  <arr name="enginesize">
   <str/>
   <str/>
   <str>3.5</str>
   <str>3.5</str>
   <str>3.5</str>
   <str>3.5</str>
   <str>3.5</str>
  </arr>
 <doc>

<doc> 
  <str name="part">engine bolt</str>
  <arr name="enginesize">
   <str>6</str>
   <str>6</str>
   <str>6</str>
   <str>6</str>
   <str>6</str>
  </arr>
 <doc>

 <doc> 
  <str name="part">air filter</str>
  <arr name="enginesize">
   <str/>
   <str/>
   <str></str>
   <str></str>
   <str></str>
   <str></str>
   <str></str>
  </arr>
 <doc>

То, что я ищу, является запросом, который задержит документы 1 и 3 выше, когда я сделаю фасет ищет объем двигателя для 3,5. Первый документ (крепление двигателя) соответствия, потому что это содержит значение в одном из многозначных полей "enginesize", что я ищу (содержит 3.5 в одном из полей). Однако третий документ для воздушного фильтра не становится возвращенным из-за пустого <str> значения. Я не хочу возвращать второй документ вообще, потому что он не соответствует фасетному значению

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

У кого-то есть запрос, который возвратил бы документ 1 и документ 3 (скобка механизма и воздушный фильтр), но не документ болта механизма?

Я попробовал следующее без успеха (включая тот в самом верху этого вопроса):

// returns everything
enginesize:"3.5"    OR  (enginesize:[* TO *] )
// only returns document 1
enginesize:"3.5"    OR  (enginesize:["" TO ""] AND -enginesize:"3.5")
// only returns document 1
enginesize:"3.5" OR (enginesize:"")

Я импортировал данные выше использования файла CSV, я установил поле keepEmpty=true. Я пытался вместо этого вручную вставить пробел в поле, когда я генерировал файл CSV (который даст Вам <str> </str>, вместо предыдущего, и затем повторенный запросы. Делая это, я получил следующие результаты:

// returns document 1
enginesize:"3.5" OR enginesize:(*:* AND -enginesize:[* TO *])
// returns all documents
enginesize:"3.5"    OR  (enginesize:["" TO ""] AND -enginesize:"3.5")
// returns all documents
enginesize:"3.5" OR (enginesize:"")

У кого-либо есть запрос, который работал бы или на ситуацию, есть ли у меня пространство как пустое значение или просто никакое значение вообще?

6
задан Makoto 6 December 2015 в 03:30
поделиться

2 ответа

Как насчет того, чтобы изменить способ индексации, а не способ запроса?

Вместо того чтобы пытаться индексировать "размер двигателя не имеет значения" как пустую запись, проиндексируйте ее как "ANY".

Тогда ваш запрос станет просто enginesize: "3.5" OR (enginesize:ANY)

8
ответ дан 10 December 2019 в 02:47
поделиться

Я только что играл с этим и нашел подсказку , которая, кажется, помогает мне. в переводе на ваш запрос это должно быть:

enginesize:"3.5" OR (-enginesize:["" TO *])

hth,

andi


update: после еще нескольких тестов я не думаю, что это работает надежно - для некоторых индексов это должно было быть наоборот и без минуса знак, то есть размер двигателя: [* TO ""] . это может зависеть от типа индекса, если он многозначен, или даже от фактических значений.

в любом случае это кажется слишком хакерским. я, вероятно, решу заменить пустое значение специальным маркером ...

1
ответ дан 10 December 2019 в 02:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: