我尝试使用Elasticsearch实现自动完成功能,因为我知道如何理解它...
我正在尝试使用ES的edge_n_grams建立多字(短语)建议,同时索引已抓取的数据。
tokenizer
和token_filter
之间有什么区别 - 我已经阅读了有关这些的文档但仍需要对它们有更多的了解....
例如是一个token_filter ES用来搜索用户输入的内容?是一个令牌化器,ES用来制作令牌吗?什么是令牌?
ES是否可以使用这些内容创建多字建议?
答案 0 :(得分:41)
标记生成器会将整个输入拆分为标记,标记过滤器会对每个标记应用一些转换。
例如,我们说输入为The quick brown fox
。如果您使用edgeNGram tokenizer ,您将获得以下令牌:
T
Th
The
The
(最后一个字符是空格)The q
The qu
The qui
The quic
The quick
The quick
(最后一个字符是空格)The quick b
The quick br
The quick bro
The quick brow
The quick brown
The quick brown
(最后一个字符是空格)The quick brown f
The quick brown fo
The quick brown fox
但是,如果您使用标准标记生成器将输入拆分为单词/标记,然后使用edgeNGram 标记过滤器,则您将获得以下标记
T
,Th
,The
q
,qu
,qui
,quic
,quick
b
,br
,bro
,brow
,brown
f
,fo
,fox
正如您所看到的,在edgeNgram tokenizer 或令牌过滤器之间进行选择取决于您希望如何对文本进行切片和切块以及如何搜索它。 / p>
我建议看看优秀的elyzer工具,该工具提供了一种可视化分析过程并查看每个步骤中产生的内容(标记化和令牌过滤)的方法。
从ES 2.2开始,_analyze
端点还支持explain feature,在分析过程的每个步骤中都会显示详细信息。
答案 1 :(得分:1)
我想发布一些详细的用例。
默认情况下,该令牌生成器将所有文本视为单个令牌,因为默认情况下令牌可以包含任何字符(包括空格)。
GET {ELASTICSEARCH_URL}/_analyze
{
"tokenizer": "edge_ngram",
"text": "How are you?"
}
结果:
["H", "Ho"]
说明:一个令牌,min_gram
= 1,max_gram
= 2。
PUT {ELASTICSEARCH_URL}/custom_edge_ngram
{
"settings": {
"analysis": {
"analyzer": {
"custom_edge_ngram": {
"tokenizer": "custom_edge_ngram_tokenizer"
}
},
"tokenizer": {
"custom_edge_ngram_tokenizer": {
"type": "edge_ngram",
"min_gram": 2,
"max_gram": 7
}
}
}
}
}
GET {ELASTICSEARCH_URL}/custom_edge_ngram/_analyze
{
"analyzer": "custom_edge_ngram",
"text": "How old are you?"
}
结果:
["Ho", "How", "How ", "How o", "How ol", "How old"]
说明:还有一个令牌,min_gram
= 2,max_gram
= 7。
PUT {ELASTICSEARCH_URL}/custom_edge_ngram_2
{
"settings": {
"analysis": {
"analyzer": {
"custom_edge_ngram": {
"tokenizer": "custom_edge_ngram_tokenizer"
}
},
"tokenizer": {
"custom_edge_ngram_tokenizer": {
"type": "edge_ngram",
"min_gram": 2,
"max_gram": 7,
"token_chars": ["letter"]
}
}
}
}
}
GET {ELASTICSEARCH_URL}/custom_edge_ngram_2/_analyze
{
"analyzer": "custom_edge_ngram",
"text": "How old are you?"
}
结果:
["Ho", "How", "ol", "old", "ar", "are", "yo", "you"]
说明:4个令牌How
,old
,are
,you
(由于token_chars
,令牌只能包含字母),min_gram
= 2,max_gram
= 7,但句子中的最大令牌长度为3。
Tokenizer将文本转换为令牌流。
令牌过滤器可用于流中的每个令牌。
令牌过滤器可以通过添加,更新,删除其令牌来修改流。
让我们使用standard
令牌生成器。
GET {ELASTICSEARCH_URL}/_analyze
{
"tokenizer": "standard",
"text": "How old are you?"
}
结果:
["How", "old", "are", "you"]
现在让我们添加令牌过滤器。
GET {ELASTICSEARCH_URL}/_analyze
{
"tokenizer": "standard",
"filter": [
{ "type": "edge_ngram",
"min_gram": 2,
"max_gram": 7
}
],
"text": "How old are you?"
}
结果:
["Ho", "How", "ol", "old", "ar", "are", "yo", "you"]
说明:每个令牌edge_nram
。