elasticsearch - Elasticsearch-按术语查找仅是给定查询字符串一部分的文档

标签 elasticsearch

我在Elasticsearch中搜索时遇到问题,希望能对您有所帮助。

我想找到一个关键字标记化的文档,索引中的分析器仅将其小写。当生成的术语是搜索查询的一部分时,我希望Elasticsearch能够找到它。

示例搜索:

 "query": {
    "match": {
      "categoryNames": "CD&DVD Aufbewahrung schwarz"
    }
  }

我要查找的文档:
"_source": {
    "categoryId": 11972638,
    "categoryNames": [
        "DVD-Koffer",
        "CD-Koffer",
        "CD-Aufbewahrung",
        "DVD-Aufbwahrung",
        "DVD-Ordner",
        "EDV-DVD-Aufbewahrung",
        "EDV-CD-Aufbewahrung",
        "CD&DVD Aufbewahrung",
        "Multimediabox"
    ],
    "lvl3Id": 11972638
}

索引分析器:
"analysis" : {
    "analyzer" : {
        "default" : {
             "type": "custom",
             "tokenizer": "keyword",
             "filter" : ["lowercase"]
         }
      }
 }

我要查找的文档的术语 vector :
"cd&dvd aufbewahrung": {
    "term_freq": 1,
    "tokens": [
      ...
    ]
},
"cd-aufbewahrung": {
     "term_freq": 1,
     "tokens": [
       ...
      ]
},
"cd-koffer": {
      "term_freq": 1,
      "tokens": [
        ...
       ]
},
....

我没有结果当我仅搜索“CD&DVD aufbewahrung”时,我找到了文档。

我认为elasticsearch试图找到一个不存在的术语“CD&DVD Aufbewahrung schwarz”,而不是匹配“CD&DVD Aufbewahrung”而忽略“schwarz”。

搜索不能使用标准分析器,因为重要的是只有“CD&DVD Aufbewahrung”才能找到“CD&DVD Aufbewahrung”,而不是仅包含“Aufbewahrung”或“Aufbewahrung CD&DVD”的字词,在分析该字词时会找到该字词通过例如空格。

以下示例符合我对上述文档的期望:
CD&DVD Aufbewahrung -> Found
CD&DVD aufbewahrung -> Found
schwarz CD&DVD Aufbewahrung -> Found
CD&DVD Aufbewahrung gelb -> Found
schwarz CD&DVD Aufbewahrung gelb -> Found
CD&DVD schwarz Aufbewahrung -> not Found
Aufbewahrung CD&DVD -> not Found
schwarz CD & DVD Aufbewahrung -> not Found
schwarzCD&DVD Aufbewahrung -> Not Found

有谁知道如何解决这个问题?

最佳答案

也许使用带有Shingle Token Filter的自定义分析器在这里会有所帮助。请参见下面的代码:

制图

PUT /so53412408
{
  "settings": {
    "analysis": {
      "analyzer": {
        "lowercase_keyword": {
          "tokenizer": "keyword",
          "filter": [
            "lowercase"
          ]
        },
        "lowercase_shingle": {
          "tokenizer": "whitespace",
          "filter": [
            "lowercase",
            "my_shingle"
          ]
        }
      },
      "filter": {
        "my_shingle": {
          "type": "shingle",
          "min_shingle_size": 2,
          "max_shingle_size": 4
        }
      }
    }
  },
  "mappings": {
    "_doc": {
      "properties": {
        "categoryNames": {
          "type": "text",
          "analyzer": "lowercase_keyword",
          "search_analyzer": "lowercase_shingle"
        }
      }
    }
  }
}

样本数据
POST /so53412408/_doc
{
  "categoryNames": [
    "DVD-Koffer",
    "CD-Koffer",
    "CD-Aufbewahrung",
    "DVD-Aufbwahrung",
    "DVD-Ordner",
    "EDV-DVD-Aufbewahrung",
    "EDV-CD-Aufbewahrung",
    "CD&DVD Aufbewahrung",
    "Multimediabox"
  ]
}

搜索查询
GET /so53412408/_search
{
  "query": {
    "match": {
      "categoryNames": "schwarzCD&DVD Aufbewahrung"
    }
  }
}

结果
CD&DVD Aufbewahrung              -> Found
CD&DVD aufbewahrung              -> Found
schwarz CD&DVD Aufbewahrung      -> Found
CD&DVD Aufbewahrung gelb         -> Found
schwarz CD&DVD Aufbewahrung gelb -> Found
CD&DVD schwarz Aufbewahrung      -> Not Found
Aufbewahrung CD&DVD              -> Not Found
schwarz CD & DVD Aufbewahrung    -> Not Found
schwarzCD&DVD Aufbewahrung       -> Not Found

关于elasticsearch - Elasticsearch-按术语查找仅是给定查询字符串一部分的文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53412408/

相关文章:

elasticsearch - 如何获得在相同键中具有最高_score的文档?

elasticsearch - Elasticsearch 通用映射类型并根据数据类型运行聚合

elasticsearch - Elasticsearch中的通配符搜索或部分匹配

elasticsearch - Elasticsearch仅查询具有自定义日期格式的年份

java - 尝试为 Elasticsearch 创建传输客户端时出现 NoNode 错误

elasticsearch - 尝试安装 Elastic ECK 时出现错误 413

node.js - 使用nodejs lib在elasticsearch上执行原始查询

json - 创建索引模板时,JSON解析异常

javascript - 如何向 ElasticSearch 添加新字段?

docker - Elasticsearch Docker慢日志文件位置设置