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

StackOverflow https://stackoverflow.com/questions/2250751

  •  20-09-2019
  •  | 
  •  

Вопрос

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

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

Этот запрос будет соответствовать 3,5 или соответствовать записям, где не было никакого значения для поля размера двигателя (никакое значение не означало, что это не имело значения, и он подходил для автомобиля). Идеальный...

ПРОБЛЕМА: Недавно я сделал поля атрибутов автомобиля, многоцелевые поля, чтобы я мог хранить атрибуты для каждой части в качестве списка. Затем я применил к нему ограждение, и это работало нормально. Тем не менее, проблема возникла, когда я применил запрос, упомянутый выше. При выборе аспекта EngineSize Facet сузил количество документов, отображаемых только для документов, которые имеют этот размер двигателя, записи (я также использую Word Record для ознакомления с документом), которые имели пустые значения (то есть "") для 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. Первый документ (крепление двигателя) соответствует, потому что он содержит значение в одном из многоцелевых полей, которые я ищу (содержит 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:"")

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

Это было полезно?

Решение

Как насчет того, как вы индексируете, вместо того, как вы запрашиваете?

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

Тогда ваш запрос просто становится двигателем: "3.5" или (Enginesize: любой)

Другие советы

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

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

hth,

и я


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

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

У меня была та же проблема, но решил ее в https://stackoverflow.com/a/35633038/13365:

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

А -enginesize Решение не сработало для меня.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top