MVA 是否可以与 Sphinx 中的文本字段一起使用?

Will MVA work with text fields in Sphinx?

我在 sphinx configuration.

中通过查找 table 索引一个 id
sql_attr_multi = uint customer_type_id from ranged-query; \
SELECT f.orderID AS ID, f.typeID \
FROM LUT_customerType f \
WHERE f.orderID BETWEEN $start AND $end \
ORDER BY f.orderID; \
SELECT MIN(orderID), MAX(orderID) FROM LUT_customerType

这个returns,例如,在给定的字段中:

customer_type_id: 3,5.15

因为 LUT table 只是存储 orderIDtypeID

但是,我现在想索引类型名称(我使用 MySql 来查询它,但我希望这样会更有效率)。

我试过这样做:

sql_joined_field = customer_type_name from ranged-query; \
SELECT f.orderID AS ID, n.Name \
FROM LUT_customerType f \
INNER JOIN customerType_Names n ON f.typeID= n.ID \
AND f.orderID BETWEEN $start AND $end \
ORDER BY f.orderID; \
SELECT MIN(orderID), MAX(orderID) FROM LUT_customerType

换句话说,我复制了工作 MVA Select 有两个小的变化:

  1. 我添加了一个额外的连接来获取类型名称
  2. 我删除了这个单位,因为我不希望它是一个整数

我在 MySql 中尝试了 Select,它按预期工作。

然而,从 SphinxQL

中选择时,字段和值均未显示,未显示在单个记录中
`Select * from idx_Table`

检查 Sphinx 索引结构时也没有

`Desc idx_Table`

好吧 sql_joined_field 正在制作一个 Field ...字段是 full-text 可搜索字段。

它们不存储在索引中,因此它们可以 'retrieved'(仅用于查询)。

另一方面,

属性 与 MVA 一样, 可检索,因为它们由 document-id 存储。

Sphinx 没有 Multi-Value String 属性,甚至没有可以用 'query' 构建的标量字符串属性(例如 mva/joined-field).

如果想要连接的字符串属性使用 GROUP_CONCAT mysql 聚合函数,在主 sql_query - 以及 GROUP BY

(sql_attr_multi 也可以解析逗号分隔的字符串,例如用 GROUP_CONCAT 从主 sql_query 中的字段构建。因此可以同时构建 mva 和 joined-string-attribute, 在主查询中, 不需要单独查询)


例如……

sql_query = SELECT o.orderID, description, \
    GROUP_CONCAT(f.typeID) as customer_type_id, \
    GROUP_CONCAT(n.Name SEPERATOR ' ' ORDER BY n.ID) AS customer_type_name \
    FROM orders o \
    LEFT JOIN LUT_customerType f ON (f.orderID = o.orderID) \
    LEFT JOIN customerType_Names n ON (f.typeID= n.ID) \
    GROUP BY o.orderID \
    ORDER BY NULL 

sql_attr_multi = uint customer_type_id from field;

sql_field_string = customer_type_name 

(可以使用 sql_attr_string 代替,如果只想要属性,实际上也不想将其作为字段)

...在实践中,也可能使它成为一个范围查询,就像您的小查询一样。

还要注意 GROUP_CONCAT 中的 ORDER BY。由于 sphinx 会在内部将 MVA 重新排序为数字顺序,这可确保文本属性具有相同的顺序。