查询elasticsearch中的fullname的最佳配置是什么

问题描述 投票:1回答:1

我正在尝试在Elasticsearch中设置搜索分析,我尝试了许多组合而没有任何成功,现在我不知道它是否可能:

假设我有3个用户使用以下全名

  • 约翰·多伊
  • 约翰坦·勒布斯
  • 简·多伊

打字:

  • qazxsw poi应该给John Doe和Jonathan Lebus
  • Jo应该给Jane Doe
  • Ja应该给Jane Doe和John Doe
  • doe应该只给John Doe而不是Jane Doe

最后一种情况是否可能,配置应该是什么?

其实我有这个:

doe john

谢谢

elasticsearch
1个回答
1
投票

我绝对认为您的分析仪可能适用于您的用例,我怀疑您在查询时需要帮助。

我使用您的分析器设置索引,并使用它创建一个字段:

 "analysis": {
                    "analyzer": {
                        "keyword_analyzer": {
                            "char_filter\"": [],
                            "filter": [
                                "lowercase",
                                "asciifolding",
                                "trim"
                            ],
                            "type": "custom",
                            "tokenizer": "keyword"
                        },
                        "edge_ngram_analyzer": {
                            "filter": [
                                "lowercase"
                            ],
                            "tokenizer": "edge_ngram_tokenizer"
                        },
                        "edge_ngram_search_analyzer": {
                            "tokenizer": "lowercase"
                        }
                    },
                    "tokenizer": {
                        "edge_ngram_tokenizer": {
                            "token_chars": [
                                "letter"
                            ],
                            "min_gram": "2",
                            "type": "edge_ngram",
                            "max_gram": "5"
                        }
                    }
                },

然后我索引一些文件:

PUT test
{
  "settings": {
    "analysis": {
      "analyzer": {
        "keyword_analyzer": {
          "char_filter\"": [],
          "filter": [
            "lowercase",
            "asciifolding",
            "trim"
          ],
          "type": "custom",
          "tokenizer": "keyword"
        },
        "edge_ngram_analyzer": {
          "filter": [
            "lowercase"
          ],
          "tokenizer": "edge_ngram_tokenizer"
        },
        "edge_ngram_search_analyzer": {
          "tokenizer": "lowercase"
        }
      },
      "tokenizer": {
        "edge_ngram_tokenizer": {
          "token_chars": [
            "letter"
          ],
          "min_gram": "2",
          "type": "edge_ngram",
          "max_gram": "5"
        }
      }
    }
  },
  "mappings": {
    "test_doc": {
      "properties": {
        "full_name": {
          "type": "text",
          "analyzer": "edge_ngram_analyzer"
        }
      }
    }
  }
}

然后,我为您的最后一个案例使用以下查询作为示例。

PUT test/test_doc/1
{
  "full_name": "John Doe"
}

PUT test/test_doc/2
{
  "full_name": "Jane Doe"
}

PUT test/test_doc/3
{
  "full_name": "Johnatan Lebus"
}

用上面的任何文字替换“查询”字段可以获得我们想要的结果。对于您的问题,真正的“解决方案”在查询时更具创造性,尽管从令牌角度来看似乎不太可能。

希望这可以帮助!

© www.soinside.com 2019 - 2024. All rights reserved.