Elasticsearch为键入的短语映射,索引和查询自动完成功能

时间:2019-10-10 13:39:05

标签: node.js elasticsearch autocomplete postman n-gram

这就是我的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的'specific'字段上实现自动完成,并将响应作为JSON发送到我的前端React。

当前,当我尝试查询任何内容时,都没有获得任何点击。

http://localhost:9200/boqs/_search

OR

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

我希望即使在“特殊信息”字段的中间也可以对短语执行自动完成。 有什么我想念的吗?我是Elasticsearch的新手,所以我们将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:0)

看看the analyzed tokens produced,看看您的edge_ngrams_analyzeredge_ngrams_search_analyzer如何对待文本“提供和铺设碎石处理”。 (免责声明:链接指向我创建的WIP分析调试工具)。有一个查询器elasticsearch插件对于这种情况可能更可靠。

其他一些提示: