全文查询 #
尽管可以使用 HTTP 请求参数执行简单搜索,但 Easysearch 查询域特定语言(DSL)允许您指定全部搜索选项。查询 DSL 使用 HTTP 请求主体。以这种方式指定的查询还有一个额外的优点,即其意图更加明确,并且更易于随时间调整。
此页面列出了所有全文查询类型和常用选项。考虑到选项的数量和微妙的行为,确保有用搜索结果的最佳方法是根据代表性索引测试不同的查询并验证输出。
匹配 #
创建一个 布尔查询 ,如果字段中存在搜索项,则返回结果。
查询的最基本形式仅提供字段( title
)和对应的值( wind
):
GET _search
{
"query": {
"match": {
"title": "wind"
}
}
}
采用 curl的方式:
curl --insecure -XGET -u 'admin:admin' https://<host>:<port>/<index>/_search \
-H "content-type: application/json" \
-d '{
"query": {
"match": {
"title": "wind"
}
}
}'
查询接受以下选项。有关每个参数的描述,请参见 查询选项
GET _search
{
"query": {
"match": {
"title": {
"query": "wind",
"fuzziness": "AUTO",
"fuzzy_transpositions": true,
"operator": "or",
"minimum_should_match": 1,
"analyzer": "standard",
"zero_terms_query": "none",
"lenient": false,
"cutoff_frequency": 0.01,
"prefix_length": 0,
"max_expansions": 50,
"boost": 1
}
}
}
}
多重匹配 #
类似于 匹配,但搜索多个字段.
^
允许您 增强
某些字段。助推是一种乘数,它对一个领域中的匹配比其他领域的匹配更为重要。在下面的示例中,标题字段中 wind
的匹配对 _score
的影响是绘图字段中匹配的四倍。结果是,像 The Wind Rises和Gone with the Wind 这样的电影接近搜索结果的顶部,而像 Twister 和 Sharknado 这样的影片,大概在剧情摘要中都有 wind
。
GET _search
{
"query": {
"multi_match": {
"query": "wind",
"fields": ["title^4", "plot"]
}
}
}
查询接受以下选项。有关每个参数的描述,请参见 查询选项
GET _search
{
"query": {
"multi_match": {
"query": "wind",
"fields": ["title^4", "description"],
"type": "most_fields",
"operator": "and",
"minimum_should_match": 3,
"tie_breaker": 0.0,
"analyzer": "standard",
"boost": 1,
"fuzziness": "AUTO",
"fuzzy_transpositions": true,
"lenient": false,
"prefix_length": 0,
"max_expansions": 50,
"auto_generate_synonyms_phrase_query": true,
"cutoff_frequency": 0.01,
"zero_terms_query": "none"
}
}
}
匹配布尔前缀 #
GET _search
{
"query": {
"match_bool_prefix": {
"title": "rises wi"
}
}
}
查询接受以下选项。有关每个参数的描述,请参见 查询选项
GET _search
{
"query": {
"match_bool_prefix": {
"title": {
"query": "rises wi",
"fuzziness": "AUTO",
"fuzzy_transpositions": true,
"max_expansions": 50,
"prefix_length": 0,
"operator": "or",
"minimum_should_match": 2,
"analyzer": "standard"
}
}
}
}
匹配短语 #
创建一个 匹配短语
GET _search
{
"query": {
"match_phrase": {
"title": "the wind rises"
}
}
}
查询接受以下选项。有关每个参数的描述,请参见 查询选项
GET _search
{
"query": {
"match_phrase": {
"title": {
"query": "wind rises the",
"slop": 3,
"analyzer": "standard",
"zero_terms_query": "none"
}
}
}
}
匹配短语前缀 #
GET _search
{
"query": {
"match_phrase_prefix": {
"title": "the wind ri"
}
}
}
查询接受以下选项。有关每个参数的描述,请参见 查询选项
GET _search
{
"query": {
"match_phrase_prefix": {
"title": {
"query": "the wind ri",
"analyzer": "standard",
"max_expansions": 50,
"slop": 3
}
}
}
}
通用条件 #
公共条件查询根据分片上出现的次数将查询字符串分成高频和低频条件。低频项在结果中的权重更大,高频项仅适用于已匹配一个或多个低频项的文档。从这个意义上说,您可以将这个查询看作是一个内置的、不断变化的停止词列表。
GET _search
{
"query": {
"common": {
"title": {
"query": "the wind rises"
}
}
}
}
查询接受以下选项。有关每个参数的描述,请参见 查询选项
GET _search
{
"query": {
"common": {
"title": {
"query": "the wind rises",
"cutoff_frequency": 0.002,
"low_freq_operator": "or",
"boost": 1,
"analyzer": "standard",
"minimum_should_match": {
"low_freq" : 2,
"high_freq" : 3
}
}
}
}
}
查询字符串 #
查询字符串查询根据运算符拆分文本,并逐个分析.
如果使用 HTTP 请求参数(即
_search?q=wind
)进行搜索,Easysearch 将创建一个查询字符串查询。
GET _search
{
"query": {
"query_string": {
"query": "the wind AND (rises OR rising)"
}
}
}
查询接受以下选项。有关每个参数的描述,请参见 查询选项
GET _search
{
"query": {
"query_string": {
"query": "the wind AND (rises OR rising)",
"default_field": "title",
"type": "best_fields",
"fuzziness": "AUTO",
"fuzzy_transpositions": true,
"fuzzy_max_expansions": 50,
"fuzzy_prefix_length": 0,
"minimum_should_match": 1,
"default_operator": "or",
"analyzer": "standard",
"lenient": false,
"boost": 1,
"allow_leading_wildcard": true,
"enable_position_increments": true,
"phrase_slop": 3,
"max_determinized_states": 10000,
"time_zone": "-08:00",
"quote_field_suffix": "",
"quote_analyzer": "standard",
"analyze_wildcard": false,
"auto_generate_synonyms_phrase_query": true
}
}
}
简单查询字符串 #
简单的查询字符串查询类似于查询字符串查询,但它允许高级用户直接在查询字符串中指定许多参数。查询将丢弃查询字符串的任何无效部分。
GET _search
{
"query": {
"simple_query_string": {
"query": "\"rises wind the\"~4 | *ising~2",
"fields": ["title"]
}
}
}
特殊字符 | 说明 |
---|---|
+ | 与 and 操作符一样 |
\| | 与 or 操作符一样 |
* | 通配符 |
"" | 将若干个字组成一个短语 |
() | 将一组条件组合到一起 |
~n | 用于单词后面 (e.g. wnid~3 ), 设置模糊程度参数 fuzziness 。当用于词语后面,则设置 slop 参数。参见
查询选项. |
- | Negates the term. |
查询接受以下选项。有关每个参数的描述,请参见 查询选项
GET _search
{
"query": {
"simple_query_string": {
"query": "\"rises wind the\"~4 | *ising~2",
"fields": ["title"],
"flags": "ALL",
"fuzzy_transpositions": true,
"fuzzy_max_expansions": 50,
"fuzzy_prefix_length": 0,
"minimum_should_match": 1,
"default_operator": "or",
"analyzer": "standard",
"lenient": false,
"quote_field_suffix": "",
"analyze_wildcard": false,
"auto_generate_synonyms_phrase_query": true
}
}
}
全部匹配 #
匹配所有文档。可用于测试。
GET _search
{
"query": {
"match_all": {}
}
}
不匹配 #
不匹配任何文档。很少有人用。
GET _search
{
"query": {
"match_none": {}
}
}
查询选项 #
选项 | 类型 | 说明 |
---|---|---|
allow_leading_wildcard | 布尔值 | * 和 ? 是否允许作为搜索项的第一个字符。默认值为 true |
analyze_wildcard | Boolean | Easysearch 是否应尝试分析通配符。一些分析器在这项任务上做得很差,因此默认值为 false |
analyzer | standard, simple, whitespace, stop, keyword, pattern, <language>, fingerprint | 要用于查询的分析器。不同的分析器具有不同的字符过滤器、标记化器和标记过滤器。例如, stop 分析器从查询字符串中删除停止词(例如 an 、 but 、 this )。 |
auto_generate_synonyms_phrase_query | Boolean | 值 true(默认值)自动生成
短语查询多术语同义词。例如,如果您有同义词 ba, batting average 并搜索 ba ,Easysearch 将搜索 ba OR batting average (如果此选项为 true )或 ba OR(batting 与 average) (如果该选项为 false)。 |
boost | Floating-point | 按给定乘数增加子句。用于权衡复合查询中的子句。默认值为 1.0。 |
cutoff_frequency | Between 0.0 and 1.0 or a positive integer | 该值允许您根据索引中出现的次数定义高频和低频项。介于 0 和 1 之间的数字被视为百分比。例如,0.10 为 10%。这个值意味着,如果一个单词出现在碎片上超过 10%的文档中的搜索字段中,Easysearch 会考虑单词 高频 ,并在计算搜索分数时不再强调它因为此设置是每个碎片,所以测试它对搜索结果的影响可能很困难,除非集群有很多文档。 |
enable_position_increments | Boolean | 如果为 true,结果查询将知道位置增量。当删除停止词在术语之间留下不需要的 间隙 时,此设置非常有用。默认值为 true。 |
fields | String array | 要搜索的字段列表(例如 "fields": ["title^4", "description"] )。如果未指定,则默认为 index.query.default_field 设置,默认为 [ "*" ] 。 |
flags | String | 要启用的以 \| 分隔的[标志]字符串(
简单查询字符串)(例如 AND \| OR \| NOT ),默认值为 ALL 。 |
fuzziness | AUTO , 0 , or a positive integer | 在确定术语是否与值匹配时,将一个单词更改为另一个单词所需的字符编辑(插入、删除、替换)次数。例如, wined 和 wind 之间的距离为 1。默认值 AUTO 基于每个术语的长度选择一个值,对于大多数用例来说是一个很好的选择。 |
fuzzy_transpositions | Boolean | 将 fuzzy_transposions 设置为 true(默认值)会将相邻字符的交换添加到 fuzzy 选项的插入、删除和替换操作中。例如,如果 fuzzy_transpositions 为真(交换 n 和 i ),则 wind 和 wnid 之间的距离为 1;如果为假(删除 n ,插入 n ),那么 wind 和 wnid 之间距离为 2。如果 fuzzy_transpositions 为假,则 rewind 和 wnid 与 wind 的距离相同(2),尽管更以人为中心的观点认为 wnid 是一个明显的拼写错误。对于大多数用例来说,默认值是一个不错的选择。 |
lenient | Boolean | 将 lenient 设置为 true 可以忽略查询和文档字段之间的数据类型不匹配。例如,查询字符串 8.2 可以匹配 float 类型的字段。默认值为 false。 |
low_freq_operator | and, or | 低频项的运算符。默认值为 或 。请参阅此表中的
通用条件查询和 operator 。 |
max_determinized_states | Positive integer | Lucene 可以为包含正则表达式的查询字符串(例如 "query" :"/wind.+?/" )创建的 “
states”(复杂性度量)的最大数量。较大的数字允许使用更多内存的查询。默认值为 10000。 |
max_expansions | Positive integer | 模糊查询 expand 在 fuzziness 中指定的距离内的许多匹配项。然后 Easysearch 试图将这些条款与其指数相匹配 max_expansions 指定模糊查询扩展到的最大项数。默认值为 50。 |
minimum_should_match | 正或负整数、正或负百分比、组合 | 如果查询字符串包含多个搜索项,并且您使用了 或 运算符,则需要匹配的项数将被视为匹配项。例如,如果 minimum_should_match 为 2,则 wind often rising 与 The Wind Rises 不匹配。如果 minium_sshould_match 为 1,则匹配。此选项还具有
通用条件查询的 low_freq 和 high_freq 。 |
operator | or, and | 如果查询字符串包含多个搜索项,则是否所有项都需要匹配( and ),或者只有一个项需要匹配( or ),才能将文档视为匹配项。 |
phrase_slop | 0 (default) or a positive integer | See slop . |
prefix_length | 0 (default) or a positive integer | 在模糊性中可以不考虑的主要字符数量。 |
quote_field_suffix | String | 此选项允许您根据术语是否用引号括起来来搜索不同的字段。例如,如果 quote_field_suffix 是 .exact ,并且在 title 字段中搜索 light (用引号括起来),则 Easysearch 将搜索 title.exact 字段。第二个字段可能使用不同的类型(例如 关键字 而不是 文本 )或不同的分析器。默认值为空。 |
rewrite | constant_score, scoring_boolean, constant_score_boolean, top_terms_N, top_terms_boost_N, top_terms_blended_freqs_N | 确定 Easysearch 如何重写和评分多术语查询。默认值为 constant_score 。 |
slop | 0 (default) or a positive integer | 控制查询中的单词可能被错误排序并且仍然被视为匹配的程度。来自 Lucene 文档: 查询短语中单词之间允许的其他单词的数量。例如,要切换两个单词的顺序,需要两次移动(第一次移动将单词放在另一个单词的顶部),因此为了允许短语的重新排序,slop 必须至少为两个。值为零需要完全匹配。 |
tie_breaker | 0.0 (default) to 1.0 | 改变 Easysearch 评分搜索的方式。例如, 类型 的 best_fields 通常使用任何一个字段的最高分数。如果指定介于 0.0 和 1.0 之间的 tie_breaker 值,则所有其他匹配字段的得分将更改为最高得分 + tie_bbreaker * 得分。如果指定值为 1.0,Easysearch 会将所有匹配字段的分数相加(有效地挫败了 best_fields 的目的)。 |
time_zone | UTC offset | 如果查询字符串包含日期范围(例如 "query" : "wind rises release_date[2012-01-01 to 2014-01-01]" ),则使用的时区(例如 -08:00 )。默认值为 UTC 。 |
type | best_fields, most_fields, cross-fields, phrase, phrase_prefix | 确定 Easysearch 如何执行查询并对结果进行评分。默认值为 best_fields 。 |
zero_terms_query | none, all | 如果分析器从查询字符串中删除所有术语,则是不匹配任何文档(默认)还是匹配所有文档。例如, stop 分析器从字符串 an but this 中删除所有项 |