Elasticsearch查询按术语拆分URL
在Elasticsearch中,我想查询术语,并从URL获取结果。因此,我试图让字段“url”按以下方式进行分析和查询,但结果总是空的 index config.json:Elasticsearch查询按术语拆分URL,url,
elasticsearch,tokenize,analysis,Url,
elasticsearch,Tokenize,Analysis,在Elasticsearch中,我想查询术语,并从URL获取结果。因此,我试图让字段“url”按以下方式进行分析和查询,但结果总是空的 index config.json: { "mappings": { "Mytype": { "properties": { "about": { "url": { "type": "string", "analyzer":"url_analyzer"
{
"mappings": {
"Mytype": {
"properties": {
"about": {
"url": {
"type": "string",
"analyzer":"url_analyzer"
}}}}},
"settings" : {
"analysis": {
"analyzer": {
"url_analyzer": {
"type": "custom",
"tokenizer": "url_tokenizer"
}
},
"tokenizer": {
"url_tokenizer" : {
"type": "pattern",
"pattern": "[\\.:/]+"
}}}}}
{
"query": {
"bool": {
"must": [{
"query_string": {
"default_field": "Mytype.url",
"query": "myquery"
}}],
"must_not": [],
"should": []
}},
"from": 0,
"size": 10,
"sort": [],
"facets": {}
}
在head插件中查询:
{
"mappings": {
"Mytype": {
"properties": {
"about": {
"url": {
"type": "string",
"analyzer":"url_analyzer"
}}}}},
"settings" : {
"analysis": {
"analyzer": {
"url_analyzer": {
"type": "custom",
"tokenizer": "url_tokenizer"
}
},
"tokenizer": {
"url_tokenizer" : {
"type": "pattern",
"pattern": "[\\.:/]+"
}}}}}
{
"query": {
"bool": {
"must": [{
"query_string": {
"default_field": "Mytype.url",
"query": "myquery"
}}],
"must_not": [],
"should": []
}},
"from": 0,
"size": 10,
"sort": [],
"facets": {}
}
(我也通过Java API进行了一些不同的查询——同样的问题也出现了。)
结果:
{
"mappings": {
"Mytype": {
"properties": {
"about": {
"url": {
"type": "string",
"analyzer":"url_analyzer"
}}}}},
"settings" : {
"analysis": {
"analyzer": {
"url_analyzer": {
"type": "custom",
"tokenizer": "url_tokenizer"
}
},
"tokenizer": {
"url_tokenizer" : {
"type": "pattern",
"pattern": "[\\.:/]+"
}}}}}
{
"query": {
"bool": {
"must": [{
"query_string": {
"default_field": "Mytype.url",
"query": "myquery"
}}],
"must_not": [],
"should": []
}},
"from": 0,
"size": 10,
"sort": [],
"facets": {}
}
现在,如果我把例如stackoverflow.com
作为我的查询,这就行了。但是如果我只取
stackoverflow
,结果是空的
这让我感到困惑,因为我认为url_标记器的模式应该将
作为一个限制器
这里出了什么问题?我在寻找elasticsearch分析器时遇到了这个问题,在那里我可以搜索
stackoverflow
和stackoverflow.com
。我也认为您的模式标记器看起来应该可以工作,但对我来说也不行。我没有去探究为什么没有,而是使用了一种内置的方法,将所有非字母字符上的标记分割开来,这对于URL中包含非字母字符的域来说并不完美,但对于我的用例来说已经足够好了。我还过滤了http
和https
标记,因此单独搜索这两个标记都不会返回所有结果,而是搜索http://stackoverflow.com
仍然有效
"analysis": {
"filter": {
"url_stop": {
"type": "stop",
"stopwords": ["http", "https"]
}
},
"analyzer": {
"url_analyzer": {
"tokenizer": "lowercase",
"filter": "url_stop"
}
}
}
并在映射中使用它:
"mappings": {
"my_mapping": {
"properties": {
"url": {
"analyzer": "url_analyzer",
"type": "string"
}
}
}
}
希望OP已经解决了他们的问题,但这可能对将来的其他人有用。我也是在寻找elasticsearch analyzer时遇到这个问题的,我可以在那里搜索
stackoverflow
和stackoverflow.com
。我也认为您的模式标记器看起来应该可以工作,但对我来说也不行。我没有去探究为什么没有,而是使用了一种内置的方法,将所有非字母字符上的标记分割开来,这对于URL中包含非字母字符的域来说并不完美,但对于我的用例来说已经足够好了。我还过滤了http
和https
标记,因此单独搜索这两个标记都不会返回所有结果,而是搜索http://stackoverflow.com
仍然有效
"analysis": {
"filter": {
"url_stop": {
"type": "stop",
"stopwords": ["http", "https"]
}
},
"analyzer": {
"url_analyzer": {
"tokenizer": "lowercase",
"filter": "url_stop"
}
}
}
并在映射中使用它:
"mappings": {
"my_mapping": {
"properties": {
"url": {
"analyzer": "url_analyzer",
"type": "string"
}
}
}
}
希望OP解决了他们的问题,但这可能对将来的其他人有用。您的映射似乎格式不正确,即我不确定“properties/about/url”字段是否正确,肯定缺少一些内容。如果
about
是一个对象字段,则必须在properties
结构中包含url
子字段。您能使用curl-XGET localhost:9200/您的_索引提取实际映射并用它更新您的问题吗?@Val感谢您的回复!这是JSON模式表示法,不应该是问题的一部分,因为搜索“stackoverflow.com”和许多其他查询将非常有效。尽管如此,我还是提取并检查了实际的映射。这与上面发布的完全相同。我将很快检查详细信息,但以下答案应该会让您领先一步:@Val我已经安装了中提到的分析url插件,日志告诉我它已安装,没有错误。重新启动ES后,我仍然会遇到以下异常:org.elasticsearch.ElasticsearchIllegalArgumentException:未能找到[url\u host]的令牌筛选器类型[url]
==>可能是一个新问题?我本来打算提交一个关于该插件的答案,但我还没有完成:-)但从错误判断,看起来该插件显然没有安装。您是否可以确保在ES启动时在日志中看到其名称?您的映射似乎格式不正确,即我不确定“properties/about/url”字段是否正确,一定缺少某些内容。如果about
是一个对象字段,则必须在properties
结构中包含url
子字段。您能使用curl-XGET localhost:9200/您的_索引提取实际映射并用它更新您的问题吗?@Val感谢您的回复!这是JSON模式表示法,不应该是问题的一部分,因为搜索“stackoverflow.com”和许多其他查询将非常有效。尽管如此,我还是提取并检查了实际的映射。这与上面发布的完全相同。我将很快检查详细信息,但以下答案应该会让您领先一步:@Val我已经安装了中提到的分析url插件,日志告诉我它已安装,没有错误。重新启动ES后,我仍然会遇到以下异常:org.elasticsearch.ElasticsearchIllegalArgumentException:未能找到[url\u host]的令牌筛选器类型[url]
==>可能是一个新问题?我本来打算提交一个关于该插件的答案,但我还没有完成:-)但从错误判断,看起来该插件显然没有安装。您能确保在ES启动时在日志中看到其名称吗?