Как запросить SOLR для пустых полей?

112

У меня большой индекс solr, и я заметил, что некоторые поля не обновляются правильно (индекс динамический).

Это привело к тому, что некоторые поля имеют пустое поле «id».

Я пробовал эти запросы, но они не работали:

 id:''
 id:NULL
 id:null
 id:""
 id:
 id:['' TO *]

Есть ли способ запросить пустые поля?

Спасибо

Эрик Уилсон
источник

Ответы:

144

Попробуй это:

?q=-id:["" TO *]
netcoder
источник
7
Несмотря на то, что на странице SolrQuerySyntax указано -id: [* TO *], только -id: ["" TO *] работал у меня на solr 1.4.
Джонатан Тран,
1
@ user2043553 Нет, если ?q=-id:*получишьCannot parse '-q:*': '*' or '?' not allowed as first character in WildcardQuery
Измир Рамирес
1
@YzmirRamirez Я пробовал на примере Solr 4.5.1 и, ?q=-id:*похоже, работает, как ожидалось. Возможно, ошибка парсинга связана с этой проблемой .
user2043553
Извините, забыл версию ... Lucene Specification Version: 3.2.0Я использовал. Рад, что они добавили синтаксис в Solr 4.5.1.
Измир Рамирес
Помните, что этот синтаксис, похоже, также возвращает строки, значение поля которых начинается с пробела (в Solr 4.3)
metatechbe
89

Одно предостережение! Если вы хотите составить это с помощью ИЛИ или И, вы не можете использовать его в этой форме:

-myfield:*

но вы должны использовать

(*:* NOT myfield:*)

Эта форма прекрасно сочетается. Очевидно, SOLR расширит первую форму до второй, но только когда это верхний узел. Надеюсь, это сэкономит вам время!

KK1402
источник
2
Этот ответ заслуживает большего количества очков, чем есть на самом деле. Вы сэкономили нам много времени!
Zac
+1 и здесь. Я реализовал другие параметры, но мне пришлось включить его в fq =, а не q =, а также нужно было реализовать ИЛИ, чтобы проверить, было ли поле пустым, ИЛИ имело определенное значение. Это единственный вариант, который сработал для этого варианта использования.
Pixelmixer
Я согласен, что это должен быть принятый ответ на вопрос
tinker
Ты избавил меня от такой головной боли. Я не уверен, что спасибо вам достаточно.
Camway 03
11

Если у вас большой индекс, вы должны использовать значение по умолчанию

   <field ... default="EMPTY" />

а затем запросите это значение по умолчанию. Это намного эффективнее, чем q = -id: ["" TO *]

Маттиас М
источник
Будет ли это работать только для полей типа String? Как бы вы это сделали для логического?
Джаред
Думаю, должно работать точно так же. Но ни разу не проверял.
Matthias M
2

Вы также можете использовать это так.

fq=!id:['' TO *]
user1976546
источник
1

Если вы используете SolrSharp, он не поддерживает отрицательные запросы.

Вам необходимо изменить QueryParameter.cs (создать новый параметр)

private bool _negativeQuery = false;

public QueryParameter(string field, string value, ParameterJoin parameterJoin = ParameterJoin.AND, bool negativeQuery = false)
{
    this._field = field;
    this._value = value.Trim();
    this._parameterJoin = parameterJoin;
    this._negativeQuery = negativeQuery;
}

public bool NegativeQuery
{
    get { return _negativeQuery; }
    set { _negativeQuery = value; }
}

А в классе QueryParameterCollection.cs переопределение ToString () проверяет, является ли параметр Negative истинным.

arQ[x] = (qp.NegativeQuery ? "-(" : "(") + qp.ToString() + ")" + (qp.Boost != 1 ? "^" + qp.Boost.ToString() : "");

Когда вы вызываете создателя параметра, если это отрицательное значение. Простое изменение свойства

List<QueryParameter> QueryParameters = new List<QueryParameter>();
QueryParameters.Add(new QueryParameter("PartnerList", "[* TO *]", ParameterJoin.AND, true));
Адриано Галессо Алвес
источник
1

вы можете сделать это с помощью запроса фильтра q = *: * & fq = -id: *

Нимрод Коэн
источник