我正在尝试创建一个能够完全按照我的要求返回的搜索。
例如,让我说我有2个文件,其中有一个名为' Val'
的字段第一个文档的值为' a - 复制',第二个文档是' a - 复制(2)'
我的目标是准确搜索价值' a - 复制'并且在我返回的结果中只找到第一个文档,而不是两个具有不同相似度排名的文档
当我尝试大多数常见查询时:
GET test/_search
{
"query": {
"match": {
"Val": {
"query": "a - copy",
"type": "phrase"
}
}
}
}
或:
GET /test/doc/_search
{
"query": {
"query_string": {
"default_field": "Val",
"query": "a - copy"
}
}
}
我一直都会得到这两份文件
答案 0 :(得分:0)
是的,你得到的是因为你的字段很可能是analyzed
并分成了令牌。
您需要一台与此类似的分析仪
"custom_keyword_analyzer": {
"type": "custom",
"tokenizer": "keyword",
"filter": "lowercase"
}
使用keyword
标记器和lowercase
过滤器(我注意到你索引了大写字母,但希望用小写字母搜索)。
然后使用term
过滤器搜索您的文档。
答案 1 :(得分:0)
有一个很好的文档可以在ES中找到确切的值: https://www.elastic.co/guide/en/elasticsearch/guide/current/_finding_exact_values.html
它向您展示了如何使用 JPanel F_panel = new JPanel();
String Fs_desc = MpaResourceBundle.getString(Ps_label, Constants.RB_PACKAGE);
String Fs_dir = P_type.getRepoDir();
String Fs_title = Fs_desc + " (" + Fs_dir + ")";
F_panel.setBorder(BorderFactory.createTitledBorder(Fs_title));
F_panel.setLayout(new GridBagLayout());
GridBagConstraints F_constr = new GridBagConstraints();
F_constr.anchor = GridBagConstraints.NORTHWEST;
F_constr.insets = new Insets(0, 0, 0, 0);
F_constr.gridx = 0;
F_constr.gridy = 0;
for (PluginID F_pid : dataHolder.getAllPluginIDs())
{
COSDependencyMetaInfoTree F_cosDepMITree = new COSDependencyMetaInfoTree(P_type,
null,
dataHolder.getMasterCOSLogObjectNames(),
F_pid,
dataHolder.getRepoObjectOwners(),
null,
P_coll);
if (F_cosDepMITree.getRowCount() > 1)
{
P_treeList.add(F_cosDepMITree);
F_panel.add(F_cosDepMITree, F_constr);
F_constr.gridy++;
}
}
if (F_panel.getComponents().length > 0)
{
add(F_panel, P_gbc);
P_gbc.gridy++;
}
过滤器,它也提到了term
的问题。
简而言之,您需要像这样运行analyzed fields
过滤器(我已将您的值放入其中):
term
但是,这不适用于分析的字段。你不会得到任何结果。
为了防止这种情况发生,我们需要告诉Elasticsearch 通过将其设置为not_analyzed,此字段包含精确值。
有多种方法可以实现这一目标。例如custom field mappings。