elasticsearch Elasticsearch使用AND运算符进行多匹配查询,查找由断字\u分解器令牌筛选器生成的令牌,elasticsearch,lucene,elasticsearch,Lucene" /> elasticsearch Elasticsearch使用AND运算符进行多匹配查询,查找由断字\u分解器令牌筛选器生成的令牌,elasticsearch,lucene,elasticsearch,Lucene" />

elasticsearch Elasticsearch使用AND运算符进行多匹配查询,查找由断字\u分解器令牌筛选器生成的令牌

elasticsearch Elasticsearch使用AND运算符进行多匹配查询,查找由断字\u分解器令牌筛选器生成的令牌,elasticsearch,lucene,elasticsearch,Lucene,我使用德语,并遵循文档中提到的示例。到现在为止,一直都还不错。它起作用了!。文本kaffeetasse被标记为kaffee和tasse 当我使用对kaffeetasse的多匹配查询来查找kaffee和tasse都匹配的文档时,出现了问题。在多匹配查询中,似乎多匹配使用或作为连字号分解器过滤器生成的标记,而不是给定的运算符(“AND”)。这是我的测试用例 映射 curl -XPUT "http://localhost:9200/testidx" -H 'Content-Type

我使用德语,并遵循文档中提到的示例。到现在为止,一直都还不错。它起作用了!。文本
kaffeetasse
被标记为
kaffee
tasse

当我使用对kaffeetasse的多匹配查询来查找kaffee和tasse都匹配的文档时,出现了问题。在多匹配查询中,似乎多匹配使用作为连字号分解器过滤器生成的标记,而不是给定的运算符(“AND”)。这是我的测试用例

映射

curl -XPUT "http://localhost:9200/testidx" -H 'Content-Type: application/json' -d'{  "settings": {    "index": {      "analysis": {        "analyzer": {          "index": {            "type" : "custom",            "tokenizer": "whitespace",            "filter": [ "lowercase" ]          },          "search": {            "type" : "custom",            "tokenizer": "whitespace",            "filter": [ "lowercase", "hyph" ]          }        },        "filter": {          "hyph": {            "type": "hyphenation_decompounder",            "hyphenation_patterns_path": "analysis/de_DR.xml",            "word_list": ["kaffee", "zucker", "tasse"],            "only_longest_match": true,            "min_subword_size": 4          }        }      }    }  },    "mappings" : {      "properties" : {        "title" : {          "type" : "text",          "analyzer": "index",          "search_analyzer": "search"        },        "description" : {          "type" : "text",          "analyzer": "index",          "search_analyzer": "search"        }      }    }  }' 
文档id=1

curl -XPOST "http://localhost:9200/testidx/_doc/1" -H 'Content-Type: application/json' -d'{  "title" : "Kaffee",  "description": "Milch Kaffee tasse"}' 
文档id=2

curl -XPOST "http://localhost:9200/testidx/_doc/2" -H 'Content-Type: application/json' -d'{  "title" : "Kaffee",  "description": "Latte Kaffee Becher"}' 
多匹配查询

curl -XGET "http://localhost:9200/testidx/_search" -H 'Content-Type: application/json' -d'{  "query": {    "multi_match": {      "query": "kaffeetasse",      "fields": ["title", "description"],      "operator": "and",     "type": "cross_fields",     "analyzer": "search"    }  }}'
我的期望是elasticsearch应该只返回id=1的单个文档,就像它在其字段中有
kaffee
tasse
一样,但它返回两个文档时都有
kaffee
tasse
文本

弹性搜索:7.9.2


de_DR.xml
从下载,如文档中所述。

Elasticsearch返回这两个文档,因为它将
运算符
参数应用于原始查询
kaffeetasse
,而不是analyzer生成的令牌
kaffee
tasse
。for
match
query中描述的此类行为:

运算符(可选,字符串)布尔逻辑,用于解释
查询
值中的文本

由于原始查询是一个单词,
运算符
参数没有意义

作为一种解决方法,您可以分两步执行搜索:

  • 使用以下命令分析原始查询字符串:

  • 使用从
    search
    analyzer收到的令牌作为
    multi_match
    查询的单词,并将
    操作符
    参数设置为
    ,将
    analyzer
    参数设置为
    空白
    (以防止已分析的令牌被
    search
    analyzer再次分析):


  • 我担心执行步骤1的往返过程会花费额外的时间。我在考虑提取Lucene断字解压器功能,并在将查询发送到Elasticsearch之前对其进行预处理。同样的问题。我们正在进行一项电子商务搜索,搜索中使用了像
    Tablethalterung
    这样的英语单词。为了解决这个问题,我们使用了一个特定于领域的单词列表,该列表将丹格利什复合词拆分为correct。但是结果是无用的,因为我们得到了所有包含
    tablet
    halter
    的文档,而不是tablet和halter,我们当前基于ES 2 handels的搜索结果与预期一致。你找到解决方案了吗?@ThomasHaarbach,还没有找到任何基于Elasticsearch的解决方案。到目前为止,在发送到ES之前使用Lucene断字分解器对查询进行标记似乎是一个可行的解决方法。嗯,这是可行的。我试过es analysies往返,结果也很糟糕,因为原始术语在令牌流中,例如[kaffeetasse,kaffee,tasse]。打开这个话题
     curl -XGET "http://localhost:9200/testidx/_analyze" -H 'Content-Type: application/json' -d'{"analyzer": "search", "text": "kaffeetasse"}'
    
     curl -XGET "http://localhost:9200/testidx/_search" -H 'Content-Type: application/json' -d'{ "query": {"multi_match": {"query": "kaffee tasse", "fields": ["title", "description"], "operator": "and", "type": "cross_fields", "analyzer": "whitespace"}}}'