我正在尝试对两个指定字段进行简单查询,并且手册和谷歌证明没什么帮助。下面的例子应该很清楚我想要做什么。
{
"query": {
"and": {
"term": {
"name.family_name": "daniel",
"name.given_name": "tyrone"
}
}
}
}
作为一个额外的问题,为什么它会找到“Daniel Tyrone”和“daniel”,但是如果我搜索“Daniel”则不会。它的行为就像一个非常奇怪的反案例敏感搜索。
答案 0 :(得分:10)
编辑:已更新,抱歉。在Bool查询中,每个字段都需要一个单独的Term
对象:
{
"query": {
"bool": {
"must" : [
{
"term": {
"name.family_name": "daniel"
}
},
{
"term": {
"name.given_name": "tyrone"
}
}
]
}
}
}
ElasticSearch不会分析术语查询,这会使它们区分大小写。术语查询说ES“在索引中查找此精确令牌,包括案例和标点”。
如果您想要不区分大小写,可以在分析器中添加关键字+小写过滤器。或者,您可以使用在查询时分析文本的查询(如Match
查询)
Edit2:您也可以使用And或Bool过滤器。
答案 1 :(得分:2)
我在同一领域找到了至少多个文本比较的解决方案:
{
"query": {
"match": {
"name.given_name": {
"query": "daniel tyrone",
"operator": "and"
}
}
}
我在多个领域找到了这个,这是正确的方法吗?
{
"query": {
"bool": {
"must": [
{
"match": {
"name.formatted": {
"query": "daniel tyrone",
"operator": "and"
}
}
},
{
"match": {
"display_name": "tyrone"
}
}
]
}
}
}
答案 2 :(得分:0)
如果用PHP编写json,这两个例子对我有用。
$ activeFilters只是一个逗号分隔的字符串,如:'attractions,limpopo'
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class game extends JFrame {
/**
*
*/
private static final long serialVersionUID = 1L;
public game() {
nonMaingame canvas = new nonMaingame();
setSize(1020, 720);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
add(canvas);
}
public static void main(String[] args) {
new game().setVisible(true);
}
public class nonMaingame extends JPanel implements ActionListener {
/**
*
*/
private static final long serialVersionUID = 1L;
JLabel text;
public nonMaingame() {
setLayout(new BorderLayout());
JPanel canvasSouth = makePanel(Color.RED);
add(canvasSouth, BorderLayout.SOUTH);
JPanel canvasNorth = makePanel(Color.BLUE);
add(canvasNorth, BorderLayout.NORTH);
JPanel canvasEast = makePanel(Color.YELLOW);
canvasEast.setBackground(Color.YELLOW);
add(canvasEast, BorderLayout.EAST);
JPanel canvasWest = makePanel(Color.MAGENTA);
add(canvasWest, BorderLayout.WEST);
text = new JLabel("hey");
canvasSouth.add(text);
}
protected JPanel makePanel(Color color) {
JPanel pane = new JPanel() {
@Override
public Dimension getPreferredSize() {
return new Dimension(100, 100);
}
};
pane.setBackground(color);
return pane;
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
}
}
}
答案 3 :(得分:0)
这对我有用:minimum_should_match
设置为 2
,因为 AND
查询的参数数量为 2
。
{
"query": {
"bool": {
"should": [
{"term": { "name.family_name": "daniel"}},
{"term": { "name.given_name": "tyrone" }}
],
"minimum_should_match" : 2
}
}
}