จะสอบถาม SOLR สำหรับช่องว่างได้อย่างไร?


112

ฉันมีดัชนีโซลขนาดใหญ่และฉันสังเกตเห็นว่าบางฟิลด์ไม่ได้รับการอัปเดตอย่างถูกต้อง (ดัชนีเป็นแบบไดนามิก)

ซึ่งส่งผลให้บางช่องมีฟิลด์ "id" ว่าง

ฉันได้ลองใช้คำถามเหล่านี้แล้ว แต่ไม่ได้ผล:

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

มีวิธีสอบถามช่องว่างไหม

ขอบคุณ

คำตอบ:


144

ลองสิ่งนี้:

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

7
แม้ว่าหน้า SolrQuerySyntax จะระบุว่า -id: [* TO *] มีเพียง -id: ["" TO *] เท่านั้นที่ใช้ได้กับฉันใน solr 1.4
Jonathan Tran

1
@ user2043553 ไม่ถ้าคุณ?q=-id:*ได้รับCannot parse '-q:*': '*' or '?' not allowed as first character in WildcardQuery
Yzmir Ramirez

1
@YzmirRamirez ฉันได้ลองใช้ตัวอย่างของ Solr 4.5.1 แล้วและ?q=-id:*ดูเหมือนว่าจะได้ผลตามที่คาดไว้ ข้อผิดพลาดในการแยกวิเคราะห์อาจเกี่ยวข้องกับปัญหานี้
user2043553

ขออภัยลืมเวอร์ชัน ... Lucene Specification Version: 3.2.0ฉันใช้. ดีใจที่พวกเขาเพิ่มไวยากรณ์ใน Solr 4.5.1
Yzmir Ramirez

ระวังว่าไวยากรณ์นี้ดูเหมือนจะส่งคืนแถวที่ค่าฟิลด์เริ่มต้นด้วยช่องว่าง (ใน Solr 4.3)
metatechbe

89

ข้อแม้! หากคุณต้องการเขียนผ่าน OR หรือ AND คุณไม่สามารถใช้ในแบบฟอร์มนี้:

-myfield:*

แต่คุณต้องใช้

(*:* NOT myfield:*)

แบบฟอร์มนี้สามารถประกอบได้อย่างสมบูรณ์แบบ เห็นได้ชัดว่า SOLR จะขยายรูปแบบแรกเป็นแบบที่สอง แต่เฉพาะเมื่อเป็นโหนดบนสุด หวังว่านี่จะช่วยคุณประหยัดเวลา!


2
คำตอบนี้สมควรได้รับคะแนนมากกว่าที่มีอยู่จริง คุณช่วยเราได้มาก!
Zac

+1 ที่นี่เช่นกัน ฉันใช้ตัวเลือกอื่น ๆ แต่ต้องรวมไว้ใน fq = แทนที่จะเป็น q = และต้องใช้ OR เพื่อตรวจสอบว่าฟิลด์ว่างหรือมีค่าเฉพาะหรือไม่ นี่เป็นตัวเลือกเดียวที่ใช้ได้กับกรณีการใช้งานนั้น
Pixelmixer

ฉันยอมรับว่านี่ควรเป็นคำตอบที่ยอมรับสำหรับคำถาม
คนจรจัด

คุณช่วยฉันปวดหัวมาก ฉันไม่แน่ใจว่าคำขอบคุณเพียงพอหรือไม่
Camway


11

หากคุณมีดัชนีขนาดใหญ่คุณควรใช้ค่าเริ่มต้น

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

จากนั้นค้นหาค่าเริ่มต้นนี้ ซึ่งมีประสิทธิภาพมากกว่า q = -id: ["" TO *] มาก


สิ่งนี้จะใช้ได้เฉพาะกับช่องประเภท String หรือไม่ คุณจะทำเพื่อบูลีนได้อย่างไร?
jared

ฉันเดาว่ามันน่าจะทำงานในลักษณะเดียวกัน แต่ฉันไม่เคยตรวจสอบเลย
Matthias M


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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.