0

我只是将 mu 客户数据库复制到 Elasticsearch 中以获得更快的结果。

在我的列表页面上,我有一个搜索字段,可以将任何字符串搜索到我的客户数据库中。搜索应该能够匹配电子邮件、名字、姓氏、身份证和电话的结果。

我创建了一个nGram过滤器,只能匹配查询的一部分

ES.client.indices.putSettings({
            index: `customer`,
            body: {
                analysis : {
                    index_analyzer: {
                        my_index_analyzer: {
                            type: "custom",
                            tokenizer: "standard",
                            filter: ["lowercase", "mynGram"]
                        }
                      },
                      search_analyzer: {
                        my_search_analyzer: {
                            type: "custom",
                            tokenizer: "standard",
                            filter: [ "standard", "lowercase", "mynGram"]
                        }
                      },
                      filter: {
                        mynGram: {
                            type: "nGram",
                            min_gram: 2,
                            max_gram: 30
                        }
                      }
                },
                max_ngram_diff: 30
            }
        })

我的查询是

{
   "index":"customer",
   "pageNum":1,
   "perPage":20,
   "query":{
      "bool":{
         "must":[
            {
               "bool":{
                  "should":[
                     {
                        "match":{
                           "organizationId":"org_1"
                        }
                     },
                     {
                        "match":{
                           "organizationId":"org_2"
                        }
                     }
                  ]
               }
            },
            {
               "multi_match":{
                  "fields":[
                     "id",
                     "email",
                     "firstName",
                     "lastName",
                     "phone"
                  ],
                  "query":"loc"
               }
            }
         ]
      }
   },
   "sort":{
      "createdAt":{
         "order":"desc"
      }
   }
}

但这不是我想要的。

例如,我的一封电子邮件是test@geo.loc,如果我搜索loc我没有结果。

我用 4 封电子邮件进行了另一次测试test@geo.loc test1@test.com test2@test.com test@test.com。寻找test它只会返回test@geo.loc并且test@test.com应该返回所有结果

其他测试电话号码之一是2211111111如果我正在寻找1111我没有结果但2211111111可以工作

4

1 回答 1

0

而不是multi_match尝试query_string

 {
       "index":"customer",
       "pageNum":1,
       "perPage":20,
       "query":{
          "bool":{
             "must":[
                {
                   "bool":{
                      "should":[
                         {
                            "match":{
                               "organizationId":"org_1"
                            }
                         },
                         {
                            "match":{
                               "organizationId":"org_2"
                            }
                         }
                      ]
                   }
                },
              {
              "query_string": {
                "query": "*1111*",
                "fields":["id", "email", "firstName", "lastName", "phone"]
              }
            }

       },
       "sort":{
          "createdAt":{
             "order":"desc"
          }
       }
    }
于 2019-12-20T11:38:10.943 回答