elasticsearch:关键字分析字段前缀查询中的连字符

a5g8bdjr  于 2021-06-15  发布在  ElasticSearch
关注(0)|答案(2)|浏览(533)

我遇到了这样一种情况:我将发票的元数据放入elasticsearch 1.5.2索引中,该索引运行在带有oraclejdk8u45的ubuntulinux15.04上。其中一个字段是ponumber,它的值通常类似于“123-r45678”或“123-4q5678”。我尝试使用prefixquery(通过查询解析器)搜索以前缀开头的值,例如“123-4*”或“123-r*”。我最接近成功的方法是在ponumber字段中使用关键字分析器,并在搜索时使用相同的关键字分析器,url如下所示:

http://localhost:9200/myindex/_search?q=invoices.poNumber:123-4Q*&analyzer=keyword&analyze_wildcard=true&explain=true

尽管索引中有“123-4q5678”,但这不会返回任何结果。但是,当我搜索“123-4*”时,我得到的结果与“123-4q5678”匹配:

http://localhost:9200/myindex/_search?q=invoices.poNumber:123-4*&analyzer=keyword&analyze_wildcard=true&explain=true

关键字分析器不应该做任何事情来分解字符串。我甚至在分析终点测试过这个。查找不带连字符的值的前缀查询似乎可以正常工作。为什么添加“q”字符会导致此查询不返回结果?如果字母正好在连字符后面,也会发生这种情况。
此外,当出现连字符时,即使整个字符串值是prefixquery的“前缀”,它也不会返回结果。但是,它会在精确匹配查询中返回结果(请参见下文)如果值或查询中不存在连字符,则搜索精确的值作为前缀会返回匹配的文档。
以下是一些其他测试结果:

value        search term    success
123-4Q5678   123*           yes
123-4Q5678   123-*          yes
123-4Q5678   123-4*         yes
123-4Q5678   123-4Q*        no
123-4Q5678   123-4Q5*       no
123-4Q5678   123-4Q5678*    no
123-4Q5678   123-4Q5678     yes
123-R45678   123*           yes
123-R45678   123-*          yes
123-R45678   123-R*         no
123-R45678   123-R4*        no
123-R45678   123-R45678*    no
123-R45678   123-R45678     yes
r4q567       R*             yes
r4q567       R4*            yes
r4q567       R4Q*           yes
r4q567       R4Q567*        yes
r4q567       R4Q567         yes
pbpqsu0x

pbpqsu0x1#

你可以用它 q=... 还有语法。 q=...query_string 事实上,这是一个较短的版本。
以及 query_string 这有点令人困惑,因为它有一些默认值,需要注意才能解释某些情况。
您的尝试就是这样:有一个名为 lowercase_expanded_terms 哪个是 true 默认情况下。这样做的目的是将输入字符串小写。所以,当你在寻找 123-4Q* 事实上,你在寻找 123-4q* (小写)。但是,在你的索引中 keyword 分析你的大写字母q永远不会匹配。
您的查询将使用以下命令:

http://localhost:9200/myindex/_search?q=invoices.poNumber:123-4Q*&analyzer=keyword&lowercase_expanded_terms=false

如果你想知道为什么 123-4Q5678 匹配尽管是大写的,是因为 lowercase_expanded_terms 适用于某些条件,通配符是其中之一:
通配符、前缀、模糊和范围查询的术语是否自动小写(因为它们没有被分析)。默认为true。

z9zf31ra

z9zf31ra2#

@paulirwin@searchtechbot索引此字段时,请使用最小值为1、最大值为10的edgegram筛选器,并且不要使用前缀查询,只匹配关键字。这是怎么回事,你是索引词的每一部分,如:“1”“12”“123”“123-”“123-4”等。。。。所以只要匹配它就会找到你的话的任何部分,如果它是从乞求你的话。

相关问题