首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >elasticsearch匹配phrase_prefix和其他

elasticsearch匹配phrase_prefix和其他
EN

Stack Overflow用户
提问于 2015-11-09 10:52:31
回答 2查看 932关注 0票数 0

嗨,我对elasticsearch有个问题,我有一些结果

  • 模数离子
  • 测试锂文件

如果输入'mod‘我找不到结果,则在执行查询时,我将类型:“phrase_prefix”添加到查询中,现在我找到结果

模数离子

但是现在当我输入锂a时没有找到结果

测试锂文件

我的请求

代码语言:javascript
复制
    $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‘的问题又回来了

所以我想在这两种情况下都有结果,你能帮我吗?

我用这个查询设置分析器

代码语言:javascript
复制
 {"analysis" : {
    "analyzer" : {
        "synonym" : {
            "tokenizer" : "whitespace",
            "filter" : ["synonym"]
        }
    },
"filter" : {
            "synonym" : {
                "type" : "synonym",
                "synonyms_path" : "synonym.txt",
                "ignore_case" : true
            }
        }
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-09 19:45:47

首先,我不认为您的映射有任何问题,它们在后端工作得很好。您的问题是您正在查询_all字段,需要单独配置该字段。如果没有指定该参数,则它将具有默认参数,可以看到这里。为了改变这种情况,我使用了以下设置和映射:

代码语言:javascript
复制
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 lithiumlithium替换为同义词。
  • 由于lowercase过滤器,所以搜索是不区分大小写的。

使用这些映射,我将您的数据添加到索引中:

代码语言:javascript
复制
PUT /test/test/1
{
  "text": "modul'ion"
}

PUT /test/test/2
{
  "text": "test lithium file"
}

因此,现在运行以下查询:

代码语言:javascript
复制
POST /test/test/_search
{
  "query": {
    "match": {
      "_all": {
        "query": "rechargeable lithium",
        "type": "phrase_prefix"
      }
    }
  }
}

返回给我这个文档:

代码语言:javascript
复制
{
  "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"
        }
      }
    ]
  }
}

这两个问题都是:

代码语言:javascript
复制
POST /test/test/_search
{
  "query": {
    "match": {
      "_all": {
        "query": "mod",
        "type": "phrase_prefix"
      }
    }
  }
}

POST /test/test/_search
{
  "query": {
    "match": {
      "_all": {
        "query": "modulion",
        "type": "phrase_prefix"
      }
    }
  }
}

返回以下内容:

代码语言:javascript
复制
{
  "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中处理这些查询。

票数 3
EN

Stack Overflow用户

发布于 2015-11-09 19:23:41

问题不是查询类型,而是同义词。同义词过滤器通常用于将一个词替换为另一个词,而不是用整个短语替换,因为该短语之后不会被标记。

您必须知道分析使用了两次:一次在索引时,另一次在搜索时。让我们假设您的文档使用标准分析器(默认分析器)进行了分析:

  • 输入“modul‘’ion”→1索引项:“modul‘’ion”
  • 输入“测试锂文件”→3索引术语:“测试”、“锂”、“文件”

如果您也使用标准分析搜索(没有同义词),那么使用phrase_prefix:

  • 输入"mod“→1搜索词前缀"mod”,见#1
  • 输入“锂”→1搜索词前缀“锂”在#2中
  • 输入“测试锂”→2搜索词前缀“测试”,“锂”在#2中找到

如果您正在使用自定义分析器进行搜索(同义词)

  • 输入"mod“→1搜索词前缀"mod”,见#1
  • 输入“锂”→1搜索词前缀“可充电锂”未找到
  • 输入“测试锂”→2搜索词前缀“测试”,“可充电锂”未找到

如果索引是小写的(索引时的分析链包含小写过滤器),也应该谨慎使用大写字母大写(搜索时的分析链生成“锂”而不是“锂”)。

如果你是Elasticsearch的新手,我建议你:

  1. 从相同的索引和搜索分析设置开始。您已经知道如何配置分析器,只需使用Put映射API配置索引即可
  2. 分析API测试分析链

例如:

代码语言:javascript
复制
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 lithium
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33607542

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档