在 Elastic 5.4 中选择正确的 Tokenizer 以模拟包含类似查询

Choosing right Tokenizer in Elastic 5.4 for emulate contains like queries

我正在使用 Elastic 5.4 来实现建议/完成之类的功能,并且在根据我的要求选择正确的分词器时面临问题。下面是示例:

索引中有4篇文献,内容如下:

文档 1:掌声

文档 2:苹果

文档 3:这是一个苹果

文档 4:应用程序

文档 5:有 is_an_appl

查询

查询 1:查询字符串“App”应该 return 所有 5 个文档。

查询 2:查询字符串“Apple”应该 return 仅文档 2 和文档 3。

查询 3:查询字符串“Applications”应该 return 仅记录 4.

查询 4:查询字符串“appl”应该 return 所有 5 个文档。

分词器

我在 Elastic 中使用以下分词器,我看到所有文档 return 为查询 2 和查询 3 编辑。

分析器应用于“text”类型的字段。

"settings": {
    "analysis": {
      "analyzer": {
        "my_ngram_analyzer": {
          "tokenizer": "my_ngram_tokenizer"
        }
      },
      "tokenizer": {
        "my_ngram_tokenizer": {
          "type": "ngram",
          "min_gram": "3",
          "max_gram": "3",
          "token_chars": [
            "letter",
            "digit"
          ]
        }
      }
    }
  }

如何将结果限制为 return 个文档,这些文档包含与查询字符串完全匹配的内容,无论是作为现有单词、短语还是精确单词的一部分(我已经提到了上述查询中提供了预期结果)?

那是因为您使用的是 nGram tokenizer instead of edgeNGram。后者仅索引前缀,而前者将索引前缀、后缀以及数据的子部分。

将您的分析器定义更改为此,它应该会按预期工作:

"settings": {
    "analysis": {
      "analyzer": {
        "my_ngram_analyzer": {
          "tokenizer": "my_ngram_tokenizer"
        }
      },
      "tokenizer": {
        "my_ngram_tokenizer": {
          "type": "edge_ngram",          <---- change this
          "min_gram": "3",
          "max_gram": "3",
          "token_chars": [
            "letter",
            "digit"
          ]
        }
      }
    }
  }