在Elasticsearch中,我想查询术语并从URL获取结果。因此,我试图让这个领域" url"通过以下方式进行分析和查询 - 但结果总是空的。
指数-config.json:
{
"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": "[\\.:/]+"
}}}}}
在head-plugin中查询:
{
"query": {
"bool": {
"must": [{
"query_string": {
"default_field": "Mytype.url",
"query": "myquery"
}}],
"must_not": [],
"should": []
}},
"from": 0,
"size": 10,
"sort": [],
"facets": {}
}
(我通过Java API查询的方式有点不同 - 出现同样的问题。)
结果:
现在,如果我采取例如stackoverflow.com
为myquery
但如果我仅使用stackoverflow
,则结果为空。
这让我感到困惑,因为我认为url_tokenizer的模式应该将.
作为限制器。
这里有什么问题?
答案 0 :(得分:2)
我遇到了这个,因为我也在寻找一个弹性搜索分析器,我可以搜索stackoverflow
和stackoverflow.com
。我也认为你的模式标记器看起来应该可以工作,但它也不适合我。我没有查看为什么没有这样做,而是仅使用内置的lowercase tokenizer将所有非字母字符上的标记分开,这对于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已经解决了他们的问题,但也许这对未来的其他人有用。