Elasticsearch edgeNGram analyzer / tokenizer模糊查询匹配

时间:2017-06-27 09:50:10

标签: elasticsearch analyzer fuzzy

我们有一个Accounts表,我们正在使用模糊查询和edgeNGram分析器搜索多个字段的类似记录。我们的设置:

设置

{
  settings: {
    analysis: {
      analyzer: {
        edge_n_gram_analyzer: {
          tokenizer: "whitespace",
          filter: ["lowercase",  "ednge_gram_filter"]
        }
      },
      filter: {
        ednge_gram_filter: {
          type: "edgeNGram",
          min_gram: 2,
          max_gram: 10
        }
      }
    }
  }
}

映射

{
  mappings: {
    document_type: {
      properties: {
        uid: {
          type: "text",
          analyzer: "edge_n_gram_analyzer"
        },
        shop_name: {
          type: "text",
          analyzer: "edge_n_gram_analyzer"
        },
        seller_name: {
          type: "text",
          analyzer: "edge_n_gram_analyzer"
        },
        ...
        ...
        ...
        locale_id: {
          type: "integer"
        }
      }
    }
  }
}

查询

{
  body: {
    query: {
      bool: {
        must: [
          {
            bool: {
              should: [
                {
                  fuzzy: {
                    uid: {
                      value: "antonline",
                      boost: 1.0,
                      fuzziness: 2,
                      prefix_length: 0,
                      max_expansions: 100
                    }
                  }
                },
                {
                  fuzzy: {
                    seller_name: {
                      value: "antonline",
                      boost: 1.0,
                      fuzziness: 2,
                      prefix_length: 0,
                      max_expansions: 100
                    }
                  }
                },
                {
                  fuzzy: {
                    shop_name: {
                      value: "antonline",
                      boost: 1.0,
                      fuzziness: 2,
                      prefix_length: 0,
                      max_expansions: 100
                    }
                  }
                }
              ]
            }
          }
        ],
        must_not: [
          {
            term: {
              locale_id: {
                value: 7
              }
            }
          }
        ]
      }
    }
  }
}

上面的例子找到了'antonline'字符串的不同变体,例如“antonline”,“sanjonline”,“tanonline”,“kotonline”,“htonline”,“awmonline”。但是,它不匹配带有标点符号的字符串,如 antonline.com ,甚至没有点的 antonlinecom 。我们尝试了不同类型的标记器,但没有任何帮助。

我们怎样才能达到预期的搜索结果?

1 个答案:

答案 0 :(得分:1)

我通过删除与此正则表达式匹配的所有内容解决了该问题:

[.,'\"\-+:~\^!?*\\] 

在建立索引和搜索时进行删除。