我使用的是Elasticsearch 2.2.0,但这也发生在1.x版本中。
其中一个文本字段包含单词google.com。当我尝试在谷歌上搜索时,ElasticSearch不会返回任何内容。但如果我搜索谷歌,它会返回包含它的文档。
我的查询很简单,大致如下:
query: {
filtered: {
query: {
simple_query_string: {
query: "google"
}
}
}
}
当我搜索谷歌时,我应该怎么做才能让Elastic搜索返回文档?
我建议阅读有关_all
字段的文档,因为simple_query_string
在没有指定任何字段时会使用此字段,这就是您的情况。
默认情况下,使用standard
分析器对_all
进行索引,这意味着google.com
将不会在.
进行拆分,而将被索引为google.com
。这意味着搜索google.com
会在索引中查找该术语,而在文本中则有google
。
Elasticsearch中的搜索不仅涉及查询,还涉及对数据进行索引的方式。它可能不像使用LIKE的SQL查询那么简单,但同时,ES在插入时比SQL提供了更多的功能。
根据您想要的simple_query
,您有多种选择:
- 更改
_all
字段的分析器:
{
"settings": {
"analysis": {
"analyzer": {
"letter": {
"type": "custom",
"tokenizer": "letter",
"filter": [
"lowercase"
]
}
}
}
},
"mappings": {
"test": {
"_all": {
"analyzer": "letter"
}
以及查询:
"query": {
"simple_query_string": {
"query": "google"
}
}
- 更改
field
的分析器并**使用query_string_query
中的该字段:
{
"settings": {
"analysis": {
"analyzer": {
"letter": {
"type": "custom",
"tokenizer": "letter",
"filter": [
"lowercase"
]
}
}
}
},
"mappings": {
"test": {
"properties": {
"text": {
"type": "string",
"analyzer": "letter"
}
}
查询:
"query": {
"simple_query_string": {
"query": "google",
"fields": ["text"]
}
}
- 使用自己的
letter
分析器定义自己的自定义all字段,并在simple_query_string中使用
我用"通配符"查询进行这种查询
https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-wildcard-query.html
{
"query": {
"bool": {
"must": {
"wildcard": {
"fieldname": "google*" // replace the fieldname her
}
}
}
}
}