Elasticsearch сопоставление, индексация и запросы для автозаполнения для напечатанных фраз - PullRequest
0 голосов
/ 10 октября 2019

Вот как выглядят мои данные ES:

"boqList" : [ 
        {
            "particulars" : "Excavation ",
            "quantity" : 1500,
            "unit" : "m3",
            "rate" : 500,
            "amount" : 750000
        }, 
        {

            "particulars" : "Providing & laying Rubble Soling",
            "quantity" : 300,
            "unit" : "m2",
            "rate" : 450,
            "amount" : 135000
        }, 
        {

            "particulars" : "Providing & laying PCC M10",
            "quantity" : 30,
            "unit" : "m2",
            "rate" : 650,
            "amount" : 19500
        }, 
        {

            "particulars" : "Providing & Laying Reinforcement With Cutting, Bending & Binding With Binding Wire Etc Complete.",
            "quantity" : 50,
            "unit" : "M.T.",
            "rate" : 80000,
            "amount" : 4000000
        }, 
        {

            "particulars" : "Providing & Making Double Scaffolding",
            "quantity" : 350,
            "unit" : "m2",
            "rate" : 150,
            "amount" : 52500
        }, 

       ...

Мой код NodeJS для индексации и отображения данных выглядит примерно так:

client.indices.create({
            index: "boqs",

            body: {

            settings: {
                index: {
                    analysis: {
                    filter: {},

                    analyzer: {


                    edge_ngram_analyzer: {
                    filter: ["lowercase"],
                    tokenizer: "edge_ngram_tokenizer"
                    },

                    edge_ngram_search_analyzer: {
                    tokenizer: "lowercase"
                    }

                    },

                    tokenizer: {
                        edge_ngram_tokenizer: {

                        type: "edge_ngram",
                        min_gram: 2,
                        max_gram: 5,
                        token_chars: ["letter"]

                        }
                    }


                }
                }
            },



            mappings: {


                properties: {
                boqList: {
                    properties: {
                        amount: {
                            type: "long"
                        },
                        particulars: {
                            type: "text",
                            fields: {
                                edgengram: {
                                    type: "text",
                                    analyzer: "edge_ngram_analyzer",
                                    search_analyzer: "edge_ngram_search_analyzer"
                                    }
                            },
                            analyzer: "standard"
                        },
                        quantity: {
                            type: "long"
                        },
                        rate: {
                            type: "long"
                        },
                        unit: {
                            type: "text",
                            fields: {
                                keyword: {
                                    type: "keyword",

                                }
                            }
                        }
                    }
                },
                projectId: {
                    type: "text",
                    fields: {
                        keyword: {
                            type: "keyword",

                        }
                    }
                }
            }



            },
            },
            }, function(err,resp,respcode){
            console.log(err,resp,respcode);
            })

Также я индексирую своиданные вроде этого:

http://localhost:9200/boqs/_doc/3
{
    "projectId" : "ABCD",
    "boqList" : [ 
       {
            "particulars" : 
            {
                "input" : ["Providing & laying Rubble Soling"]
            },
            "quantity" : 300,
            "unit" : "m2",
            "rate" : 450,
            "amount" : 135000
        }
        ]

}



Я пытался использовать подход Edge NGram, чтобы реализовать автозаполнение в поле «частности» моего boqList и отправить ответ в виде JSON на мой интерфейс, который называется React. ,

В настоящее время, когда я пытаюсь что-либо запросить, я не получаю никаких обращений.

http://localhost:9200/boqs/_search

ИЛИ

http://localhost:9200/boqs/_search
{
  "query": {
    "multi_match": {
      "query": "Providing",  
      "type": "phrase", 
      "fields": "boqList.particulars"
    }
  }
}

Я хотел иметь возможность выполнять авто-полный для фраз, даже в середине поля «подробности». Я что-то упускаю? Я относительно новичок в Elasticsearch, и поэтому любая помощь будет принята с благодарностью. Спасибо!

1 Ответ

0 голосов
/ 13 октября 2019

Взгляните на проанализированных токенов, полученных , чтобы увидеть, как ваши edge_ngrams_analyzer и edge_ngrams_search_analyzer обрабатывают текст "Обеспечение и укладка Rubble Soling". (отказ от ответственности: ссылка на созданный мной инструмент отладки анализа - WIP). Существует плагин Inquisitor эластичного поиска, который, вероятно, более надежен для таких примеров.

Несколько дополнительных советов:

  • Ваша настройка max_gram установлена ​​только на 5, что означаетСамым длинным токеном, созданным для пользовательского поиска «Обеспечение», является «provi», который не будет совпадать с токеном времени поиска, созданным только с помощью «1011 *» токена «предоставляющий».
  • Elasticsearch имеет подсказку для завершения, которая может помочь вамИзбегайте как можно большего количества стен с деталями более низкого уровня - см. Подсказка к завершению
  • Вот исчерпывающий пост на тему включения автозаполнения: https://medium.com/@mourjo_sen/a-detailed-comparison-between-autocompletion-strategies-in-elasticsearch-66cb9e9c62c4 - похоже, он охватываетподход анализа нграмм и подход подсказчика
...