Elasticsearch Query String Query ไม่ทำงานกับตัววิเคราะห์คำพ้องความหมาย

ฉันกำลังพยายามกำหนดค่าการค้นหาแบบยืดหยุ่นด้วยคำพ้องความหมาย

นี่คือการตั้งค่าของฉัน:

                "analysis": {
                    "analyzer": {
                        "category_synonym": {
                            "tokenizer": "whitespace",
                            "filter": [
                                "synonym_filter"
                            ]
                        }
                    },
                    "filter": {
                        "synonym_filter": {
                            "type": "synonym",
                            "synonyms_path": "synonyms.txt"
                        }
                    }
                }

การกำหนดค่าการแมป:

        "category": {
            "properties": {
                "name": {
                    "type":"string",
                    "search_analyzer" : "category_synonym",
                    "index_analyzer" : "standard",
                    "fields": {
                        "raw": {
                            "type":  "string",
                            "index": "not_analyzed"
                        }
                    }
                }
            }
        }

และรายการคำพ้องความหมายของฉัน

film => video,
ooh => panels , poster,
commercial => advertisement,
print => magazine

ฉันต้องบอกว่าฉันใช้ Elasticsearch Java API ฉันใช้ QueryBuilders.queryStringQuery เพราะนี่เป็นวิธีเดียวที่ฉันตั้งค่าตัววิเคราะห์ตามคำขอของฉัน ดังนั้นเมื่อฉันทำ:

QueryBuilders.queryStringQuery("name:film").analyzer(analyzer)

มันส่งคืนฉัน

[
  {
    "id": 71,
    "name": "Pitch video",
    "description": "... ",
    "parent": null
  },
  {
    "id": 25,
    "name": "Video",
    "description": "... ",
    "parent": null
  }
]

นั่นเหมาะสำหรับฉัน แต่เมื่อฉันกำลังเรียกอะไรแบบนี้

QueryBuilders.queryStringQuery("name:vid").analyzer(analyzer)

ฉันคาดหวังว่ามันควรจะส่งคืนวัตถุเดียวกัน แต่ไม่มีอะไรเลย: []

ดังนั้นฉันจึงเพิ่มเครื่องหมายดอกจันไปที่ queryStringQuery:

QueryBuilders.queryStringQuery("name:vid*").analyzer(analyzer)

ใช้งานได้ดี แต่ตอนนี้

QueryBuilders.queryStringQuery("name:film*").analyzer(analyzer)

คืนให้ฉัน []

ดังนั้น ฉันจะกำหนดค่าการค้นหาแบบยืดหยุ่นได้อย่างไรเพื่อให้ส่งคืนออบเจ็กต์เดียวกันเมื่อฉันค้นหา video, vid, film และ fil

ขอบคุณล่วงหน้า!


person Sanat Serikuly    schedule 19.04.2017    source แหล่งที่มา


คำตอบ (1)


หืม ฉันไม่คิดว่า Elasticsearch จะรู้วิธี "แปล" fil เป็น vid :-) ดังนั้น ฉันคิดว่าคุณต้องการ edgeNGrams สำหรับสิ่งนี้ ทั้งในเวลาจัดทำดัชนีและค้นหา

PUT test
{
  "settings": {
    "analysis": {
      "analyzer": {
        "category_synonym": {
          "tokenizer": "whitespace",
          "filter": [
            "synonym_filter",
            "my_edgeNGram_filter"
          ]
        },
        "standard_edgeNGram": {
          "tokenizer": "standard",
          "filter": [
            "lowercase",
            "synonym_filter",
            "my_edgeNGram_filter"
          ]
        }
      },
      "filter": {
        "synonym_filter": {
          "type": "synonym",
          "synonyms_path": "synonyms.txt"
        },
        "my_edgeNGram_filter": {
          "type": "edgeNGram",
          "min_gram": 2,
          "max_gram": 8
        }
      }
    }
  },
  "mappings": {
    "test": {
      "properties": {
        "name": {
          "type": "string",
          "analyzer": "category_synonym",
          "index_analyzer": "standard_edgeNGram",
          "fields": {
            "raw": {
              "type": "string",
              "index": "not_analyzed"
            }
          }
        }
      }
    }
  }
}

POST test/test/1
{"name": "Pitch video"}
POST test/test/2
{"name": "Video"}

GET /test/test/_search
{
  "query": {
    "query_string": {
      "query": "name:fil"
    }
  }
}
person Andrei Stefan    schedule 19.04.2017
comment
ได้ผล! ขอบคุณอังเดร! - person Sanat Serikuly; 21.04.2017