嗨,我对elasticsearch有个问题,我有一些结果
如果输入'mod‘我找不到结果,则在执行查询时,我将类型:“phrase_prefix”添加到查询中,现在我找到结果
模数离子
但是现在当我输入锂a时没有找到结果
测试锂文件
我的请求
$query ['match'] ['_all'] ["query"] = strtolower ( $keyword );
$query ['match'] ['_all'] ["type"] = "phrase_prefix";
$query ['match'] ['_all'] ["analyzer"] = "synonym";此外,我还使用了同义词分析器,其中包含“锂=>Rechargeable锂”,我的问题是如果a不使用分析器或我删除
$query 'match‘"type“= "phrase_prefix";
我找到了结果,但是'mod‘的问题又回来了
所以我想在这两种情况下都有结果,你能帮我吗?
我用这个查询设置分析器
{"analysis" : {
"analyzer" : {
"synonym" : {
"tokenizer" : "whitespace",
"filter" : ["synonym"]
}
},
"filter" : {
"synonym" : {
"type" : "synonym",
"synonyms_path" : "synonym.txt",
"ignore_case" : true
}
}
}
}发布于 2015-11-09 19:45:47
首先,我不认为您的映射有任何问题,它们在后端工作得很好。您的问题是您正在查询_all字段,需要单独配置该字段。如果没有指定该参数,则它将具有默认参数,可以看到这里。为了改变这种情况,我使用了以下设置和映射:
PUT /test
{
"settings": {
"analysis": {
"analyzer": {
"my_analyzer": {
"tokenizer": "whitespace",
"char_filter": ["my_mapping"],
"filter": [
"lowercase",
"my_synonym"
]
}
},
"filter": {
"my_synonym": {
"type": "synonym",
"ignore_case": true,
"synonyms": [
"rechargeable lithium => lithium"
]
}
},
"char_filter": {
"my_mapping": {
"type": "mapping",
"mappings": [
"'=>"
]
}
}
}
},
"mappings": {
"test": {
"_all": {
"enabled": true,
"analyzer": "my_analyzer"
}
}
}
}这些设置将在空白空间破坏您的令牌,从令牌中删除引号并将其小写,以便:
modul'ion将被索引为modulion,每当用户输入这些短语时,他都会找到它。rechargeable lithium被lithium替换为同义词。lowercase过滤器,所以搜索是不区分大小写的。使用这些映射,我将您的数据添加到索引中:
PUT /test/test/1
{
"text": "modul'ion"
}
PUT /test/test/2
{
"text": "test lithium file"
}因此,现在运行以下查询:
POST /test/test/_search
{
"query": {
"match": {
"_all": {
"query": "rechargeable lithium",
"type": "phrase_prefix"
}
}
}
}返回给我这个文档:
{
"took": 2,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 0.15342641,
"hits": [
{
"_index": "test",
"_type": "test",
"_id": "2",
"_score": 0.15342641,
"_source": {
"text": "test lithium file"
}
}
]
}
}这两个问题都是:
POST /test/test/_search
{
"query": {
"match": {
"_all": {
"query": "mod",
"type": "phrase_prefix"
}
}
}
}
POST /test/test/_search
{
"query": {
"match": {
"_all": {
"query": "modulion",
"type": "phrase_prefix"
}
}
}
}返回以下内容:
{
"took": 1,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 0.30685282,
"hits": [
{
"_index": "test",
"_type": "test",
"_id": "1",
"_score": 0.30685282,
"_source": {
"text": "modul'ion"
}
}
]
}
}这只是原始的JSON查询,但我想您将能够在PHP中处理这些查询。
发布于 2015-11-09 19:23:41
问题不是查询类型,而是同义词。同义词过滤器通常用于将一个词替换为另一个词,而不是用整个短语替换,因为该短语之后不会被标记。
您必须知道分析使用了两次:一次在索引时,另一次在搜索时。让我们假设您的文档使用标准分析器(默认分析器)进行了分析:
如果您也使用标准分析搜索(没有同义词),那么使用phrase_prefix:
如果您正在使用自定义分析器进行搜索(同义词)
如果索引是小写的(索引时的分析链包含小写过滤器),也应该谨慎使用大写字母大写(搜索时的分析链生成“锂”而不是“锂”)。
如果你是Elasticsearch的新手,我建议你:
例如:
PUT the_index/_mapping/the_type
{
"properties": {
"the_field": {
"type": "string",
"analyze": "the_analyzer"
}
}
}
GET the_index/_analyze?analyzer=synonym&text=modul'ion
GET the_index/_analyze?analyzer=synonym&text=test lithiumhttps://stackoverflow.com/questions/33607542
复制相似问题