Як запитувати SOLR для порожніх полів?


112

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

Це призвело до того, що деякі поля мають порожнє поле "id".

Я пробував ці запити, але вони не спрацювали:

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

Чи є спосіб запиту порожніх полів?

Дякую

Відповіді:


144

Спробуйте це:

?q=-id:["" TO *]

7
Навіть незважаючи на те, що на сторінці SolrQuerySyntax написано -id: [* TO *], на solr 1.4 працював лише -id: ["" TO *].
Джонатан Тран

1
@ user2043553 Ні, якщо ви ?q=-id:*отримаєтеCannot parse '-q:*': '*' or '?' not allowed as first character in WildcardQuery
Ізмір Рамірес

1
@YzmirRamirez Я спробував на прикладі Solr 4.5.1 і, ?q=-id:*здається, працює як слід. Можливо, помилка розбору пов'язана з цією проблемою .
користувач2043553

Вибачте, забув версію ... Lucene Specification Version: 3.2.0Я використовував. Радий, що вони додали синтаксис у Solr 4.5.1.
Ізмір Рамірес

Остерігайтеся, що цей синтаксис, здається, також повертає рядки, значення поля яких починається з пробілу (у Solr 4.3)
metatechbe

89

Один застереження! Якщо ви хочете скласти це через OR або AND, ви не можете використовувати його у цій формі:

-myfield:*

але ти повинен використовувати

(*:* NOT myfield:*)

Ця форма чудово поєднується. Мабуть, SOLR розширить першу форму на другу, але лише тоді, коли вона є верхнім вузлом. Сподіваюся, це заощадить вам якийсь час!


2
Ця відповідь заслуговує більшої кількості балів, ніж насправді. Ви зекономили нам багато часу!
Зак

+1 також тут. Я реалізував інші параметри, але мені довелося включити його у fq =, а не q =, а також треба було реалізувати АБО, щоб перевірити, чи поле порожнє АБО має конкретне значення. Це єдиний варіант, який працював для цього випадку використання.
Піксельміксер

Я погоджуюсь, що це має бути прийнята відповідь на питання
повозити

Ти врятував мене від головного болю. Я не впевнений, що спасибі вам достатньо.
Кемвей


11

Якщо у вас великий індекс, слід використовувати значення за замовчуванням

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

а потім запитувати це значення за замовчуванням. Це набагато ефективніше, ніж q = -id: ["" TO *]


Це працює лише для полів типу String? Як би ти це зробив для булевого?
Джаред

Я здогадуюсь, це має працювати так само. Але я ніколи цього не перевіряв.
Маттіас М


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 () виглядає, чи відповідає параметр "Негативний"

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));

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.