ไม่พบการแมปสำหรับฟิลด์เพื่อเรียงลำดับใน ElasticSearch


118

Elasticsearch พ่นไฟล์ SearchParseExceptionข้อความค้นหาในขณะที่แยกวิเคราะห์หากมีบางเอกสารที่พบว่าไม่มีฟิลด์ที่ใช้ในเกณฑ์การจัดเรียง

SearchParseException: การแยกวิเคราะห์ล้มเหลว [ไม่พบการแมปสำหรับ [ราคา] เพื่อจัดเรียง]

ฉันจะค้นหาเอกสารเหล่านี้ให้สำเร็จได้อย่างไรแม้ว่าบางส่วนจะไม่มีpriceฟิลด์ก็ตาม


1
คำถาม / คำตอบของคุณช่วยแก้ปัญหาของฉันได้ - ขอบคุณ ฉันแก้ไขเพื่อให้สรุปได้บ้างโปรดอย่าลังเลที่จะย้อนกลับหากไม่เหมาะกับคุณ
Paul Bellora

1
ข้อมูลอ้างอิงสำหรับการจัดการปัญหานี้
Elasticsearch

คำตอบ:


118

หลังจากขุดเพิ่มเติมฉันพบวิธีแก้ปัญหาตามที่ระบุด้านล่าง ignore_unmappedควรตั้งค่าอย่างชัดเจนเป็นtrueในประโยคการเรียงลำดับ

"sort" : [
       { "rating": {"order" : "desc" , "ignore_unmapped" : true} },
       { "price": {"order" : "asc" , "missing" : "_last" , "ignore_unmapped" : true} }
]

สำหรับข้อมูลเพิ่มเติมโปรดดูการอ้างอิงของ Elasticsearch สำหรับ:


สวัสดีฉันมีปัญหาเดียวกันและฉันไม่เข้าใจว่ามันทำงานอย่างไร ... แอตทริบิวต์ที่ขาดหายไปและไม่สนใจ _unmapped ควรทำงานร่วมกันได้ใช่ไหม ตัวอย่างเช่นหากฉันตั้งค่าหายไปเป็น "_last" และไม่สนใจ _ ไม่ถูกแมปเป็น "เท็จ" ฉันยังคงมีปัญหา แต่ฉันต้องการให้เอกสารอยู่ในผลลัพธ์ในทุกกรณีแม้ว่าจะไม่มีแอตทริบิวต์ก็ตาม
c4k

ฉันมีปัญหานี้และ "ไม่สนใจ _ ไม่ได้แมป" ใช้งานไม่ได้หาก _type ของคุณว่างเปล่า (กล่าวคือไม่มีเอกสารใด ๆ ที่จัดทำดัชนี)
reinaldoluckman

7
ดูเหมือนว่ากลยุทธ์ใหม่จะใช้unmapped_type
lukmdo

2
คำถามของฉันใช้งานได้ตลอดจนถึงวันนี้โดยไม่ต้องอัปเดตไลบรารีใด ๆ ฯลฯ แต่วันนี้ฉันเริ่มได้รับข้อผิดพลาดเดียวกันนี้ ตอนนี้ฉันเพิ่มแล้ว"ignore_unmapped" : trueและมันก็เริ่มทำงานอีกครั้ง แต่สิ่งที่แปลกคือเกิดอะไรขึ้นเบื้องหลัง! ใครจะรู้! อย่างไรก็ตามมันใช้งานได้แล้ว +1
BentCoder

1
ใครสามารถอธิบายความแตกต่างระหว่าง "หายไป" และ "ไม่ได้แมป" ในบางช่องหากเอกสารบางฉบับมีในขณะที่เอกสารอื่นไม่มีช่องดังกล่าวจะถือว่า "หายไป" หรือ "ไม่ได้แมป" หรือไม่ "หายไป" หมายความว่าฟิลด์อยู่ในเอกสาร แต่ค่าที่เกี่ยวข้องเป็นโมฆะหรือไม่
Sher10ck

44

สำหรับผู้ที่มองหาตัวอย่างของทั้งสองignore_unmappedและ unmapped_typeโปรดดูการตอบสนองของฉันที่นี่

โปรดทราบว่าตอนนี้ "ไม่สนใจ _unmapped" เลิกใช้งานแล้วโดยสนับสนุน "unmapped_type" นี่เป็นส่วนหนึ่งของ# 7039

จากเอกสารประกอบ:ก่อนหน้า 1.4.0 มีพารามิเตอร์บูลีนไม่ถูกเพิกเฉยซึ่งมีข้อมูลไม่เพียงพอที่จะตัดสินใจเกี่ยวกับค่าการเรียงลำดับที่จะปล่อยออกมาและไม่สามารถใช้สำหรับการค้นหาข้ามดัชนีได้ ยังคงได้รับการสนับสนุน แต่ขอแนะนำให้ผู้ใช้ย้ายไปยัง unmapped_type ใหม่แทน

ตามค่าเริ่มต้นการร้องขอการค้นหาจะล้มเหลวหากไม่มีการแมปที่เกี่ยวข้องกับฟิลด์ อ็อพชัน unmapped_type อนุญาตให้ละเว้นฟิลด์ที่ไม่มีการแมปและไม่จัดเรียงตามฟิลด์เหล่านั้น ค่าของพารามิเตอร์นี้ใช้เพื่อกำหนดค่าการเรียงลำดับที่จะปล่อยออกมา นี่คือตัวอย่างวิธีการใช้งาน:

{
    "sort" : [
        { "price" : {"unmapped_type" : "long"} },
    ],
    "query" : {
        "term" : { "user" : "kimchy" }
    }
}

หากดัชนีใด ๆ ที่สอบถามไม่มีการจับคู่ราคา Elasticsearch จะจัดการกับมันราวกับว่ามีการแมปประเภทยาวโดยเอกสารทั้งหมดในดัชนีนี้ไม่มีค่าสำหรับฟิลด์นี้


3

เห็นได้ชัดว่า ElasticSearch จะไม่เรียงลำดับตามค่า null ฉันสมมติว่ามันจะถือว่า null เป็นจุดเริ่มต้นหรือจุดสิ้นสุด (เช่นเดียวกับการสั่ง SQL) แต่ฉันเชื่อว่ามันทำให้เกิดข้อผิดพลาดนี้ด้วย

ดังนั้นหากคุณเห็นข้อผิดพลาดนี้คุณอาจต้องตรวจสอบให้แน่ใจว่าแอตทริบิวต์ sort มีค่าเริ่มต้นเมื่อส่งไปยัง ElasticSearch

ฉันมีข้อผิดพลาดนี้กับ Rails + ElasticSearch + Tyre เนื่องจากคอลัมน์การจัดเรียงไม่มีค่าเริ่มต้นดังนั้นจึงถูกส่งไปยัง ES เป็นค่าว่าง

ปัญหานี้บ่งชี้ว่ามีการจัดการค่า null แต่ไม่ใช่ประสบการณ์ของฉัน เป็นสิ่งที่น่าลองอยู่แล้ว


2

ฉันประสบปัญหาเดียวกัน (sorta; จะได้รับข้อผิดพลาดบางอย่าง แต่ผลลัพธ์บางอย่าง) แต่ในกรณีของฉันการค้นหาของฉันถูกออกที่รูท (ไม่ได้ระบุดัชนี) และข้อผิดพลาดที่ฉันได้รับนั้นเป็นเพราะการค้นหา / คำสั่งก็เช่นกัน กำลังมองหาดัชนี Kibana

ข้อผิดพลาดโง่ ๆ แต่อาจจะช่วยคนอื่นที่จบลงที่นี่


ฉันมีปัญหาเดียวกัน .. แต่เมื่อฉันระบุละเว้นไม่แมปฉันไม่ได้รับการจัดเรียงใด ๆ เลยเมื่อค้นหารูท ... สิ่งนี้จำกัดความสามารถในการค้นหาฉันหากฉันต้องกำหนดดัชนี ... ฉันแค่ต้องการทั้งหมด ผลลัพธ์ที่ตรงกันจะจัดเรียงตามเขตข้อมูลหากมีอยู่และเติมให้ใช้ค่าเริ่มต้นสำหรับผู้ที่ไม่ .. แก้ไข:
mgoetzke

2

Elasticsearch 6.4

เพียงระบุดัชนีและอยู่ใน Kibana

ก่อน

GET /_search
{
 
  "query": {
    "exists": {
      "field": "document_id"
    }
  },
  "sort": [
    {
      "document_id": { "order": "asc"  },
      "created_at":  { "order": "desc" }
    }
  ]
}

หลังจาก

GET /document-index/contact/_search  (here)
{

  "query": {
    "exists": {
      "field": "document_id"
    }
  },
  "sort": [
    {
      "document_id": { "order": "asc"  },
      "created_at":  { "order": "desc" }
    }
  ]
}


0

คุณยังสามารถใช้สคริปต์ที่ให้ความยืดหยุ่น:

"sort" : {
    "_script" : {
        "type" : "number",
        "script" : {
            "lang": "painless",
            "source": "return !doc['price'].empty ? doc['price'].value : 0"
        },
        "order" : "desc"
    }
}

0

เมื่อเราใช้โค้ดด้านล่างโดยที่added_onคือวันที่จะเกิดอะไรขึ้น !! มีการวิเคราะห์ข้อความแอตทริบิวต์ซึ่งหมายความว่าจะแบ่งออกเป็นคำที่แตกต่างกันเมื่อจัดเก็บและช่วยให้สามารถค้นหาข้อความอิสระได้ตั้งแต่หนึ่งคำขึ้นไปในฟิลด์

ดังนั้นจึงมี "ข้อความ" และ "คีย์เวิร์ด" ที่เชื่อมโยงกับฟิลด์ดังนั้นหากเราจำเป็นต้องใช้การรวมในคิวรีเราต้องการค่าฟิลด์โดยทั่วไปคือคีย์เวิร์ด

BEFORE

"_source":{....}
"query" : {...}
"sort": [
{
  "added_on": {
    "order": "desc"
  }
}
]

AFTER
"_source":{....}
"query" : {...}
"sort": [
{
  "added_on.keyword": {
    "order": "desc"
  }
}
]
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.