在MariaDB中搜索子字符串或单词

时间:2017-08-01 08:50:11

标签: sql database full-text-search mariadb string-matching

我尝试在MariaDB上进行全文搜索,遇到了一个我无法处理的问题。

我的表格生成为;

CREATE TABLE test (email TEXT, FULLTEXT(email)) ENGINE=InnoDB;

然后插入一些数据;

MariaDB [frauctive]> select * from test;
+---------------------------------+
| email                           |
+---------------------------------+
| david@hotmail.com               |
| michael@gmail.com               |
| christian@gmail.com             |
| david01@hotmail.com             |
| davidblatt@hotmail.com          |
| beckhamdavidbeckham@hotmail.com |
+---------------------------------+

当我使用匹配功能时,我无法检索我想要获得的相似度分数;

MariaDB [frauctive]> SELECT email, MATCH(email) AGAINST('*david*' IN         BOOLEAN MODE) AS relevance 
->   FROM test ORDER BY relevance DESC;
+---------------------------------+--------------------+
| email                           | relevance          |
+---------------------------------+--------------------+
| david@hotmail.com               | 0.0906190574169159 |
| david01@hotmail.com             | 0.0906190574169159 |
| davidblatt@hotmail.com          | 0.0906190574169159 |
| michael@gmail.com               |                  0 |
| christian@gmail.com             |                  0 |
| beckhamdavidbeckham@hotmail.com |                  0 |
+---------------------------------+--------------------+

Altough" beckhamdavidbeckham@hotmail.com"条目包含' david'模式,得分返回0.

你能帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

关于* wildcard:

通配符,表示零个或多个字符。它只能出现在一个单词的末尾。

源: https://mariadb.com/kb/en/mariadb/fulltext-index-overview/

请尝试:

protected void OnUpdate(object sender, EventArgs e)
{
    string StrConnString = ConfigurationManager.ConnectionStrings["BenzConnectionString"].ToString();
    SqlConnection objConn = new SqlConnection(StrConnString);

    try
    {

        objConn.Open();
        SqlCommand objCmd = new SqlCommand("UPDATE  Employee SET FirstName =  @sFirstName," +
            " LastName = @sLastName," +
            " EMail = @sEMail, " +
            "PhoneNo = @sPhoneNo, " +
            "PositionID = @sPositionID, " +
            "DepartmentID = @sDepartmentID" +
            " WHERE  EmployeeID = @sEmployeeID", objConn);

        objCmd.Parameters.AddWithValue("@sFirstName", txtfirstname.Text);
        objCmd.Parameters.AddWithValue("@sLastName", txtlastname.Text);
        objCmd.Parameters.AddWithValue("@sEMail", txtemail.Text);
        objCmd.Parameters.AddWithValue("@sPhoneNo", txtphone.Text);
        objCmd.Parameters.AddWithValue("@sPositionID", dpposition.Text);
        objCmd.Parameters.AddWithValue("@sDepartmentID", dpcenter.Text);
        objCmd.Parameters.AddWithValue("@sEmployeeID", empno);

        objCmd.ExecuteNonQuery();

        objCmd = new SqlCommand("UPDATE Item SET Brand = @sBrand, " +
            "Model = @sModel, " +
            "Serial_No = @sSerial_No, " +
            "Macaddress = @sMacaddress, " +
            "ItemTypeID = @sItemTypeID, " +
            "ReceiveDate = @sReceiveDate  " +
            "WHERE ItemID = @sItemID ", objConn);

        objCmd.Parameters.AddWithValue("@sBrand", txtbrand.Text);
        objCmd.Parameters.AddWithValue("@sModel", txtmodel.Text);
        objCmd.Parameters.AddWithValue("@sSerial_No", txtserial.Text);
        objCmd.Parameters.AddWithValue("@sMacaddress", txtmac.Text);
        objCmd.Parameters.AddWithValue("@sItemTypeID", dptype.Text);
        objCmd.Parameters.AddWithValue("@sReceiveDate", txtreceiveddate.Text);
        objCmd.Parameters.AddWithValue("@sItemID", itemid);


        objCmd = new SqlCommand("UPDATE SET InventoryLine SET Transaction_date = @sTransaction_date," +
            " ReturnDate = @sReturnDate " +
            "WHERE InventoryID = @sInventoryID", objConn);
        objCmd.Parameters.AddWithValue("@sReturnDate", txtreturndate.Text);
        objCmd.Parameters.AddWithValue("@sTransaction_date", txtreturndate.Text);
        objCmd.Parameters.AddWithValue("@sInventoryID", inventoryid);
        objCmd.ExecuteNonQuery();
    }
    catch (Exception ex)
    {
        Response.Write("<br/> Error : " + ex.Message);
    }
    finally
    {
        objConn.Close();
    }
}

或者

MariaDB [frauctive]> SELECT email, MATCH(email) AGAINST('david*' IN         BOOLEAN MODE) AS relevance 
->   FROM test ORDER BY relevance DESC;