Kueri String Kueri Elasticsearch tidak berfungsi dengan penganalisis sinonim

Saya mencoba mengonfigurasi pencarian elastis dengan sinonim.

Ini adalah pengaturan saya:

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

Konfigurasi pemetaan:

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

Dan daftar sinonim saya

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

Saya harus mengatakan bahwa saya menggunakan Elasticsearch Java API. Saya menggunakan QueryBuilders.queryStringQuery karena ini adalah satu-satunya cara saya mengatur penganalisis untuk permintaan saya. Jadi, ketika saya membuat:

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

Ini mengembalikan saya

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

Itu sempurna bagi saya, tetapi ketika saya menelepon sesuatu seperti ini

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

Saya berharap itu akan mengembalikan objek yang sama, tetapi tidak ada apa-apa: []

Jadi, saya menambahkan tanda bintang ke queryStringQuery:

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

Bekerja dengan baik, tapi sekarang

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

kembalikan aku []

Jadi, bagaimana cara mengonfigurasi pencarian elastis saya sehingga akan mengembalikan objek yang sama ketika saya mencari video, vid, film dan fil?

Terima kasih sebelumnya!


person Sanat Serikuly    schedule 19.04.2017    source sumber


Jawaban (1)


Hm, menurut saya Elasticsearch tidak akan tahu cara "menerjemahkan" fil ke vid :-). Jadi, menurut saya Anda memerlukan edgeNGrams untuk ini, baik pada waktu pengindeksan maupun pencarian.

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
Bekerja! Terima kasih Andrey! - person Sanat Serikuly; 21.04.2017